3계층
 - 네트워크와 네트워크간의 연결
 - 주소체계 : IPv4, IPv6
 - 프로토콜 : 라우팅 프로토콜, IP, IPSEC, ...
 - IP헤더의 크기 : 20바이트(가변 크기)

 

IP(Internet Protocol)
 - IPv4 -> IPv6
 - IANA : 4자리 정수를 ' . '으로 구분하여 표기
 - 0.0.0.0 ~ 255.255.255.255(약 42억개)

 - 네트워크 주소(아이디) / 호스트 주소(아이디)

 

A class : 첫번째 숫자를 네트워크 아이디로 사용
 - 첫번째 비트가 모두 0인 비트
 - 0000 0000 ~ 0111 1111 -> 0 ~ 127 
 -  최고위의 Class로서, 1~126 (0, 127 예약됨)범위의 IP주소를 가진다. 두 번째, 세 번째 그리고 네 번째 단위의 세 숫자는 A Class가 자유롭게 네트워크 사용자에게 부여가 가능한 아이피이다.

 

B class : 두번째 숫자까지 네트워크 아이디로 사용
 - 처음 두비트가 모두 10인 비트
 - 0000 0000. 0000 ~ 0000 0000 ~ 10 11 1111. 1111 1111
 - 128. 0 ~ 191.255
 - 두 번째로 높은 단위의 Class로서, 아이피 구성에서 첫 번째 단위의 세 숫자는 128 - 191 가운데 하나를 가지며 (위의 예에서 181), 두 번째 단위의 세 숫자는 B Class가 접속할 수 있는 네트워크를 지시한다.

 

C class : 세번째 숫자까지 네트워크 아이디로 사용
 - 처음 두 비트가 모두 110인 비트
 - 110 0 0000. 0000 0000. 0000 0000. ~
   110 1 1111. 1111 1111.  1111 1111
 - 192.0.0 ~ 223.255.255

 - 최하위의 Class로서, 아이피 구성에서 첫 번째 단위의 세 숫자는 192 -223 가운데 하나를 가지며 (위의 예에서 221), 두 번째와 세 번째 단위의 세 숫자는 C Class가 접속할 수 있는 네트워크를 지시한다. C Class가 자유로이 부여할 수 있는 아이피는 마지막 네 번째 단위의 254 개이다

 

ip fragmentation(ip단편화)

identification : 0
flag : 0 1 0
offset

ttl(time to live) :64 (maxinum hop)
protocol type(ip packet type) : TCP, UDP

 

 

ethernet : 이더네슨 컴퓨터 네트워크 기술의 하나로 전세계의 사무실이나 가정에서 일반적으로 사용되는 LAN에서 가장 많이 활용되는 기술 규격.

이더넷ㅇㄴ OSI모델의 물리계층에서 신호와 배선, 데이터 계층에서 MAC(media access control) 패킷과 프로토콜 형식을 정의.

 

ethernet hearer

 - 14바이트 고정크기
 - 도착지 mac address
 - 출발지 mac address
 - 이더넷 타입

 

dst는 도착치 MAC주소 볼수 있으며, sdt는 출발지 MAC주소이다.

이런식으로 볼 수가 있다.

 

 

 

 

'정보보안 > 네트워크 보안' 카테고리의 다른 글

UDP헤더  (0) 2018.03.16
OSI 7계층  (0) 2018.03.13
시스템 구축  (0) 2018.03.13

1. UDP헤더

 

우선 리눅스에 어떠한 IP들이 들어오는지에대해서 sniffer을 만들어서

 

bind를 할때 리눅스의 장치를 확인하기 위해 eth0를 넣어주었다. SOCK_RAW는 OSI 4계층까지 조작 및 볼수 있다.

이렇게 함으로써 리눅스로 들어오는 신호 및 나가는 신호에 대해서 볼수 있게 되었다.

 

udpserver를 켜두고 이어서 sniffer을 켜두고 클라이언트를 통해 데이터를 보내보았다.

 

 

 

hi123
b'\x00\x0c)\x10\xf9\x11\x00 \x0c)?\x88\x12\x08\x00E\x00\x00!\x00\x00@\x00@\x11\xb2\x8e\xc0\xa8\x03w\xc0\xa8\x03v \xa9EN \x00\r\xb3\x94 hi123\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x0c)?\x88\x12\x00\x0c)\x10\xf9\x11\x08\x00E\x00\x00!\x00\x00@\x00@\x11\xb2\x8e\xc0\xa8\x03v\xc0\xa8\x03wN \xa9E\x00\r\xb3\x94 hi123'

클라이언트에서 hi123이라는 데이터를 받고 데이터를 보낸 로그이다.

 

보면 hi123에서 8bit앞이 UDP의 헤더이다.


받은(UDP헤더 )
\xa9EN \x00\r\xb3\x94

보낸(UDP헤더 )
\xa9E\x00\r\xb3\x94

 

받은 8bit를 보면 어떤것인지 잘 모르겠다.

그래서 python쉘을 실행함으로써 알아보기로 했다.

 

 

각문자열은 0번부터 7번까지 8개의 데이터가 있는것을 볼수 있었다.

각 문자열은 눈으로는 볼수 없으나 하지만 각 숫자형 데이터라는것을 알 수 있었다.

받은 포트번호를 알기위해 16bit를 맞추기 위해서 udp의 헤더의 3번째 비트틀 좌측으로 8비트밀고 4번째 비트를 더하면 포트번호가 나온다.

그래서 받은 데이터를 20000이라는 포트번호를 알게되었다.

 

 

 

2. 엔디안 : 엔디안(Endianness)은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법을 특히 바이트 순서(Byte order)라 한다

 

 - 운영체제에서 사용하는 보통 리틀엔디안이다. (intel계열의 CPU는 리틀엔디안)

하지만 네트워크에서 사용하는 엔디안은 빅엔디안이다.

 

 

- B는 1바이트, H는 2바이트 , L은 4바이트, ! 또는 >빅엔디안을 나타냈다.

그러므로 네트워크는 빅엔디안이기 때문에 거기에 맞추어서 봐야하기때문에 빅엔디안로 봐야하는것이다.

그래서 마지막에 unpack햇을경우 우리가 얻고자하는 UDP헤더의 정보를 알수있게된것이다.

 

 

 

'정보보안 > 네트워크 보안' 카테고리의 다른 글

IP헤더  (0) 2018.03.19
OSI 7계층  (0) 2018.03.13
시스템 구축  (0) 2018.03.13

OSI 7계층

 - 표준 네트워크

 - 네트워크를 7단계로 분류

 

OSI 7계층은 상위 3계층, 하위 4계층으로 분류 할 수 있다.

 

 OSI 7계층

 주요내용

주요 프로토콜 

 

 Application

 - 사용자의 소프트웨어를 접근 가능하도록함.

 - 사용자에게 최종서비스 제공 

 - FTP, SNMP, HTTP, mail,Telnet, ... 등

 상위

3계층

 Presentation

 - 포맷기능, 압축, 암호화 

 - 텍스트 및 그래픽 정보를 컴퓨터가 이해할 수 있는    16진수 데이터로 교환

 - 압축, 암호 코드 변환

 - GIF, ASCII, EBCDIC

Session 

 - 세션연결 및 동기화 수행, 통신 방식결정

 - 가상연결을 제공하여 Login / Logout수행

 - 반이중, 전이중, 완전이중 결정 

 - SSL

Transport 

 - 가상연결, 에러제어, Data흐름제어, segment 단위

 - 두개의 종단간 end - to - end 데이터 흐름이 가능하도록 논리적 주소연결 

 - 신뢰도, 품질보증, 오류탐지 및 교정기능 제공

 - 다중화 발생

 - TCP, UDP 

 하위

4계층

 

Network 

 - 경로선택, 라우팅 수행, 논리적 주소 연결(IP)

 - 데이터 흐름조절, 주소 지정매커니즘 구현

 - 네트워크에서 노드에 전송되는 팻킷흐름을 통제하고,상태 메시지가 네트워크상에서 어떻게 노드로 전송되는가를 정의

 - Datagram 단위 

 - IP, ICMP

 - 라우팅 프로토콜(RIP, O SPF, BGF) 

 Data Link

 - 물리주소 결정, 에러제어, 흐름제어, 데이터 전송

 - Frame단위, 전송오류를 처리하는 최초의 계층 

 - 흐름제어 오류제어(ARQ)

 - 브리지, PPTP, L2TP, HDLC

 - Frame Relay  

Physical 

 - 전기적, 기계적 연결정의 , 실제 Data bit전송

 - Bit단위, 전기적 신호, 전압구성, 케이블 인터페이스 등을 구성

 - Data Rates, line noise control, 동기화기능

수행

  - 매체 : 동축케이블, 광섬유, Twist pair cabe( ex : UTP )

 

2. L4 : 전송계층(Transport)

TCP : 두 호스트 간에 1:1로 연결되어 양방향의 데이터 교환이 이루어지기 때문에 안정적인 데이터 전송이 보장.

1대1연결을 만들때 상대의 호스트의 IP를 알아야 함, 이때 사용하는것이 IP이다. TCP와 IP를 묶어서 TCP/IP라고 한다.

TCP/IP는 네트워크 프로그래밍의 핵심 프로토콜이라 이해하면된다.

HTTP(인터넷 웹 서비스), FTP(파일 전송 서비스) TCP/IP기반한 응용프로토콜

 - TCP소캣을 만들기 위해서는 소캣을 생성할때 socket모듈에 정의된 SOCK_STREAM을 전달해주면된다

 

UDP : TCP와 달리 소캣간에 1:1연결이 아니므로 안정적이지는 않지만 데이터의 전송이 빠름.

데이터들이 순서대로 도착하지 않는 특성이 있는데 이것또한 TCP와 달리 호스트간에 연결을 만들지 않고 데이터를 전송할 수 있기 떄문.

 - UDP소캣을 만들려면 소캣을 생성할떄 socket모듈의 SOCK_DGRAM을 전달해주면된다.

 

 

 

'정보보안 > 네트워크 보안' 카테고리의 다른 글

IP헤더  (0) 2018.03.19
UDP헤더  (0) 2018.03.16
시스템 구축  (0) 2018.03.13

환경

 - CentOS 6.9 mini

 - 파이썬3

 - VM ware

 

1. 리눅스 설치

 - VM ware를 통해서 설치를 하는것은 지금까지 했던것과 똑같아서 넘어가도록 했다.

 

2. 환경설정

 - 네트워크 환경

  -> 네트워크 환경은 메인 컴퓨터와 같은 IP대역대를 쓰도록 설정해줘야 한다.

브릿지 설정후 다시 리부트 시켜주었다.

 

vi를 통해서 ifcfg-eth0을 들어가서 설정을 다시해주었다.

설정후 네트워크 재시작 후 ping test를 했습니다. ping가 나가지 않아서 어떻게 잘못되었는지 다시 들어가서 확인하였다.

 

 오타와 잘못된부분을 다시 바꾸어주었더니 ping도 잘되었다.

 - IPTABLES 삭제

 - SELINUX 삭제

iptables는 /etc/sysconfig/ 밑에 있는 iptables를 삭제 하면 된다. SELINUX는 vi를 통해 편집하면된다.

 

*확인

 - 파이썬3 설치

 -->  - 파이썬 홈페이지로 가서 소스코드 다운로드
 - 링크 : https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz
 - 3.x.x버전으로 다운로드

나는 3.5.5버전떄로 설치하였다.

 

다운후 압축 해제 후 파이썬 디렉토리로 이동

.tar.xz - 이중으로 압축을 풀어야 합니다.

압축 해제 (.xz 압축 해제 -> tar 압축 해제)

xz -d [압축파일명.tar.xz]

tar -xf [압축파일명.tar]

 

소스 코드 빌드
 1) cd Python-3.6.4
 2) ./configure
 3) make
 4) make install

 

이렇게 해주면 파이썬3가 설치가 된다 이로써 실습환경 구축은 완료!!

 

 

'정보보안 > 네트워크 보안' 카테고리의 다른 글

IP헤더  (0) 2018.03.19
UDP헤더  (0) 2018.03.16
OSI 7계층  (0) 2018.03.13

킷허브 : 쉽게 사용할 수 있는 웹 인터페이스를 제공해 웹 환경의 소스코드 저장소 호스팅 서비스를 제공.


1) 이클립스 메뉴바에서 'window > Perspective > Open Persective > Other ... ' 을 선택 


->Git을 선택


2) clone a git repository를 통해서 받아올 URL주소를 입력

3) URL주소를 입력



- Git에 마스터는 파이썬2 기반의 소스이다. 파이썬3 사용자는 python3를 선택


- 마지막으로 저장위치 확인 후 Finish를 선택




마지막으로 이렇게 뜨면 된것이다.





마지막으로 프로젝트에서 마우스 오른쪽 클릭 후 properties를 눌러서 인코딩 방식을 MS949에서 UTF-8로 바꾸어 주면 된다.





'programing > 파이썬 웹 프로그래밍(플라스크)' 카테고리의 다른 글

플라스크 설치  (0) 2018.01.24

1. virtualenv

 - 소프트웨어 개발간 특정환경에서 테스트해야 하거나, 문제해결을 위해서 개발환경을 다양하게 구성해야 할경우가 있다.

 - 설치된 라이브러리의 차이점, 런타임 시스템의 버전문제 와 같은 다양한 문제는 일상적으로 발생.

 - 파이썬에서는 이런 부분 쉡게 구성할 수 있게 virtualenv라는 도구를 지원.

 - 예) 한개의 컴퓨터에서 다양한 버전의 파이썬 및 플라스크로 개발하고 싶을때 버전별로 virtualenv를 만들면 여려 환경을 구성 할수 있음.




2. virtualenv이 설치가 완료되면 사용할 가상환경을 만들어보기

 1) 컨맨드창에서 로컬 C드라이브로 이동하여 myproject 이동

2)컨맨드 창에서 "virtualenv venv"를 입력하여, 해당 디렉토리에 가상환경을 생성



3)venv하위에 Scripts로 들어가서 activate를 활성화하여 가상화 환경인지 확인(앞에 (venv) 확인)


4) 플라스크 설치

pip install flask를 통해 설치



3. 이클립스 PyDev설치 및 설정

 - 이클립스 메뉴에서 "Help > Eclipse Marketplace"을 선택 -> find검색창에 pydev를 검색


 - 이클립스 메뉴 바에서 "window > Preferences"을 선택후 창이 열리면 "PyDev > Interpreter - Python" 항목을 선택



- 'New'를 눌러서 생성한 가상환경 디렉토리에 있는 파이썬인터프리터를 선택 후 "Apply and Close" 선택을 누른다.



'programing > 파이썬 웹 프로그래밍(플라스크)' 카테고리의 다른 글

Git허브 연결  (0) 2018.01.24

1. 데이터 베이스 개요

1)데이터베이스란?

- 데이터 베이스는 데이터를 체계적으로 관리 할 수 있도록 해주는 소프트웨어 일반적으로 다음과같이 정의 할수 있다


 -데이터 베이스(Data base) : 여러 사람이 공유할 목적으로 방대한 데이터를 체계적으로 정리하여 저장한 것으로 이용하면 데이터를 

효율적으로 관리하고 검색할 수 있다.


-데이터베이스 관리 시스템(DBMS : Data Base Mangement System) : 데이터 베이스를 구성하고 운영하는 소프트웨어 시스템으로, 오라클, MS SQL,

,MySQL등이 일반적으로 알고 있는 데이터베이스 제품을 의미.


2) 데이터베이스의 장단점

 - 데이터를 사용하고 처리하는 데 있어 가장 중요한 기술적 관점은 데이터를 저장하고 이를 이용하는 방법

 - 일반적으로 데이터를 저장한 파일을 데이터 파일이라고 하는데, 데이터 파일은 서로 연관된 정보를 모아서 레코드를 만들고 다시 연관된 레코드를 

모아서 파일을 만든다.


* 데이터 베이스의 이점

 - 데이터 종복을 최소화할 수 있다.

 - 데이터 불일치 문제를 해결할 수 있다.

 - 데이터를 쉽게 공유할 수 있다.

 - 정보 표준화를 이룰수 있다.

 - 데이터에 대한 보안성을 제공한다.

 - 데이터의 무결성을 유지된다.

 - 대량의 데이터를 좀 더 빠르게 검색할 수 있다.

 - 덱스트 이외의 다양한 데이터(이미지, 파일 등)을 관리 할수 있다.


3. MySQL설치


 -  http://dev.mysql.com/downloads/ 접속




둘 중 아무거나 선택해도 되나 위에걸로 다운받았다.



깔아주고 Mysql workbench를 실행시킨다.



JSP를 실습하기 위해서 JSPDatabase만들고, 눌러서 접속을 했다.
















'programing > JSP' 카테고리의 다른 글

JSP 내장객체  (0) 2017.10.01
기본문법  (0) 2017.09.23
간단한 실습  (0) 2017.09.12
jsp개발환경 구축  (0) 2017.09.07

RSA

PyCrypto가 제공하는 공개키 암호알고리즘은 DSA,ElGaml,RSA가 있다. DSA는 공개키 서명을 위한 알고리즘, ElGaml와 RSA 공개키 암호, 공개키 서명을 모두 지원하는 알고리즘 이다.


간단히 RSA(Rivest, Shamir and Adleman)는 대표적인 공개키 암호 시스템으로 국제기구의 암호 표준일뿐만 아니라 산업표준으로 권장하고 있다.(책을 보고 처음접하는 사실....)


코드 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from Crypto.PublicKey import RSA
# PyCrypto의 RSA모듈을 import한다.
 
def ras_encrypt(msg):
    private_key = RSA.generate(1024# RSA.generate()를 이용해 개인키를 생성
    public_key = private_key.publickey()
    encdata = public_key.encrypt(msg,32)
    # private_key.publickey()로 공개키를 얻고, 이 공개키를 메세지로 암호화
    print(encdata)
 
    decdata = private_key.decrypt(encdata)
    print(decdata)
    # 공개키로 암호화한 메시지를 개인키로 복호
 
def main():
    msg = 'doohyun loves python'
    ras_encrypt(msg.encode('utf-8'))
 
main()
 

cs

공개키로 암호화 한 결과는튜플 형태로 리턴되며, 튜플의 첫번째 멤버가 암호화 한 결과 이다. 

암호결과는 10241비트(128바이트)이다.


하지만 이코드는 별로 실용적이지 못한 코드이다. 개인키와 공개키는 생성은 되지만 프로그램이 종료되는 시점에서 둘다 사라져 버리기 때문이다.

좋은 프로그램이다.라고는 하지 못한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from Crypto.PublicKey import RSA
# PyCrypto의 RSA모듈을 import한다.
 
def createPEM():
    private_key = RSA.generate(1024# RSA.generate()를 이용해 개인키를 생성
    f = open('mykey.pem','wb+')     # 개인키르를 파일형태로 만들어서 저장        
    f.write(private_key.exportKey('PEM'))
    f.close()
 
    
def readPEM(): 
    h = open('mykey.pem''r')
    key = RSA.importKey(h.read())
    h.close()    
    return key  # readPEM() 함수는 mykey.pem파일에 저장된 개인키를 읽어서 리턴
 
def rsa_enc(msg):   # RSA공개키로 메시지를 암호화 하는 함수
    private_key = readPEM()
    public_key = private_key.publickey()
    encdata = public_key.encrypt(msg,32)
    return encdata
 
def rsa_dec(msg):   # RSA개인키로 메시지를 복호화하는 함수
    private_key = readPEM()
    decdata = private_key.decrypt(msg)
    return decdata
 
 
def main():
    #createPEM()
    msg = 'doohyun loves python'
    ciphered = rsa_enc(msg.encode('utf-8'))
    print(ciphered)
 
    deciphered = rsa_dec(ciphered)
    print(deciphered)
 
main()
cs


결과는 위에 코드랑  동일한 결과를 얻을수 있었다.


RSA공개키로 서명 구현하는 프로그램

 - 공개키 서명은 사용자의 개인키로 서명하고, 암호화한 정보를 사용자의 공개키로 확인하여 해당정보를 보낸 사람이 당사자인지 확인하는 방법이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA256 as SHA
 
def readPEM():
    h = open('mykey.pem''r')
    key = RSA.importKey(h.read())
    h.close()    
    return key
 
#사용자의 개인키로 서명하는 측
def rsa_sign(msg):
    private_key = readPEM()
    public_key = private_key.publickey()    
    hash = SHA.new(msg).digest()    
    signature = private_key.sign(hash, '')
    return public_key, signature
 
# 사용자의 공개키로 서명을 확인하는 측
def rsa_verify(msg, public_key, signature):    
    hash = SHA.new(msg).digest()    
    if public_key.verify(hash, signature):
        print ('VERIFIED')
    else:
        print ('DENIED')
 
def main():
    msg = 'My name is doohyun'
    public_key, signature = rsa_sign(msg.encode('utf-8'))
    rsa_verify(msg.encode('utf-8'), public_key, signature)
 
 
main()
 
 
cs


결과 



'programing > 암호와 해킹(python)' 카테고리의 다른 글

공개키 암호  (0) 2017.10.10
AES  (0) 2017.09.28
3DES  (0) 2017.09.09
블록 암호  (0) 2017.09.08
카이사르 암호(시저 암호)  (0) 2017.09.07

1.공개키란 무엇인가?

 

대칭키 : 연산속도가 빨라 효율적인 암호시스템을 구축할 수 있으나, 암호화키와 복호화키가 동일하므로 암호화 한 사람은 복호화 할 사람에게 키를 어떤식으로 전달해야된다. 이부분에서 취약점이 존재한다.

 

공개키 암호는 대칭키 암호의 키 전달에 있어서 취약점을 해결하고자 한 노력의 결과로 탄생한 암호 방식이다.

 

공개키 암호는 한쌍의 키가 존재하며, 하나는 특정사람만이 가지는 개인키(또는 비밀키)이며, 다른 하나는 누구나 가질 수 있는 공개키라고 한다.

 

개인키로 암호화한 정보는 그 쌍이 되는 공개키로만 복호화 가능하고, 반대로 공개키로 암호화한 정보는 그쌍이 되는 개인키로만 복호화가능.

 

즉 공개키 암호방식은 암호화할 때 사용하는 암호키와 복호화 할때 사용하는 키가 서로 다르기때문에 비대킹키 암호 라고도 불리운다.

 

공개키 암호의 예시는 DH(Diffie-Hellman),DSA(Digital Signature Algorithm),ECDH(Elliptic Curve DH), ECDSA(Elliptic Curve DSA), EIGamal,RSA등이 있다.

공개키 암호는 대칭키 기반암호의 취약점인 키 전달에 대한 문제를 해결했지만 암호화, 복호화를 위해 복잡한 수학연산을 수행하기 때문에 대칭키암호에 비해 속도가 느리다는 단점이 있다. 작은 정보를 암호화하고 복호화하는 것은 문제가 없지만 용량이 큰 정보를 공개키 암호로 적용하는 것은 문제가 있을 수 있다.

 

2. 공개키 암호원리 

공개키 암호방식은 특정한 정보없이는 매우 풀기 어려운 수학문제를 바탕으로 만들어진다. 예를들면 "매우 큰 수의 소인수분해", "이산로그방정식의 해 구하기" 등 알려져 있는 매우 어려운 문제들이다.

 

매우큰수의 소인수분해에 기반한 공개키 암호원리는 다음과 같다.

소수 a,b가 있다. 이 두 수의 곱은 쉽게 구할 수 있다.

c = a X b

그런데 다음과 같이 c를 먼저 제시하고 곱해진 두 소수a,b를 구하는 문제는 풀기가 쉽지 않다.

 

c를 소인수 분해 해라.

 

여기서 c를 공개해도 a,b를 구하는것이 힘들것이다. c는 공개키로,a는 개인키로 한다.

정보를 a로 암호화하면 c에 의해서만 복호화가능하고, 정보를 c로 암호화하면 a에 의해서만 복호화 되도록 특별한 수식을 사용한다. 이 원리에 기반한 대표적인 공개키 암호가 RSA암호이다.

 

이산로그문제에 기반한 공개키 암호는 타원곡선(Elliptic Curve) 암호인 ECDH,ECDSA등이 있다.

 

 

3.공개키 기반구조(PKI)

 공개키 암호는 보안이 보장되지 않은 네트웤,에서 키 전달 문제점을 해결하여 보안통신이 가능하게 한다. 또한, 특정 사람의 공개키 서명을 통해 정보를 보낸 사람이 당사자인지 확인 가능한 기술이다.

그렇다면 특정 사람의 개인키와 공개키는 어떻게 생성할 것이며, 어떻게 배포 할것이고, 어떻게 관리를 할까??

그리고 어떤 공개키가 특정한 사람의 공개키라는것을 어떻게 보장할 수 있을까??

 

다음같은 상황을 한번 보자.

공격자가 철수의 공개키를 위조하여 영희에게 배포를 합니다. 철수가 자신의 개인키로 서명한 정보를 전달할때 공격자가 중간에서 가로채서 공격자가 위조한 개인키로 서명한 정보를 영희에게 전달할 때 공격자가 중간에서 가로채서 공격자가 위조한 개인키로 서명한 정보를 영희에게 전달합니다. 영희는 공격자가 위조한 공개키로 문서를 인증하기 때문에 수신한 문서가 위조되었는지 모릅니다. 

 

이러한 문제를 해결하기 위해 디지털 인증서를 도입하게되었고, 디지털 인증서를 활용하는 소프트웨어, 하드웨어, 정책, 제도, 사용자 등을 총칭하여 "공개키 기반 구조(PKI)"라고 한다.

 

PKI는 다음과 같이 구성되어있다,

 - 디지털 인증서 인증기관

 - 디지털 인증서

 - 인증기관을 대행하는 등록기관

 - 인증서를 보관하는 하나 이상의 디렉터리

 - 인증서 관리 시스템

 

PKI의 일반적인 기능은 다음과 같다.

 - 인증서 발급

 - 인증서 관리

 - 인증서 배포

 - 인증서 사용

 - 인증서 저장

 - 인증서 삭제

 

 

-PKI를 통한 디지털 인증절차 개념도-

'programing > 암호와 해킹(python)' 카테고리의 다른 글

RSA  (0) 2017.10.11
AES  (0) 2017.09.28
3DES  (0) 2017.09.09
블록 암호  (0) 2017.09.08
카이사르 암호(시저 암호)  (0) 2017.09.07

1)내장객체 개요.


1. JSP 내장객체란?

 - JSP내장객체란 JSP내에서 선언하지 않고 사용할 수 있는 객체라는 의미에서 붙여진 이름이다.

 - 구조적으로는 JSP가 서블릿 형태로 자동 변환된 코드 내에 포함되어 있는 멤버변수, 메서드 매개변수 등의 각종 참조 변수(객체)를 말한다.


※ 주요 JSP내장객체

request, reponse, session, applcation...


2. 내장객체의 구조적 특징

 - 서블릿으로 변경된 JSP코드는 모두 .jspService()매서드에 위치함.

 - 매서드 매개변수인 request, reponse를 비롯한 pageContent, session,applcation,page,config,out 등 매서드 내에서 참조할 수 있는 참조변수들이 내장객체가된다.


3. 내장객체를 이용한 속성관리 기법

 - 내장객체가 단순히 특정한 기능을 제공하는 컨테이너 관리 객체라는 점 외에도 한가지 특징이 있다. 바로 page, request, session, application 내장객체를 이용한 속성관리 기법이다. 이 내장객체들은 각자 지정된 생명주기가 있으며, setAttribute(), getAttribute()라는 메서드를 통해 해당 생명주기동안 자바객체를 유지하눈 기능을 제공한다.


2)request

1.request 내장객체

 - request는 사용자 요청과 관련된 기능을 제공하는 내장객체로 javax.servlet.http.HttpServletRequest 클래스에 대한 참조 변수이다.

 - 주요 클라이언트에서 서버로 전달되는 정보를 처리하기 위해 사용.

 - 대표적으로 HTML폼을 통해 입력된 값을 JSP에서 가져올때 사용한다.


※ request주요 메서드

 메서드

설명 

 getParameterNames()

현재 요청에 포함된 매개변수의 이름을 열거(Enumeration) 형태로 넘겨준다. 

 getParameter(name)

문자열 name과 이름이 같은 매개변수의 값을 가져온다. 

getParameterValues(name) 

문자열 name과 이름이 같은 매개변수의 값을 배열형태로 가져온다. 

checkbox, multiple list등에 주로 사용한다.

 getCookies()

모든 쿠키 값을 javax.servlet.http.Cookie의 형태로 가져온다. 

 getMethod()

 현재 요청이 GET아나 POST형태로 가져온다.

 getSession()

현재 세션 객체를 가져온다. 

getRemoteAddr() 

클라이언트의 IP주소를 알려준다. 

 getProtocol()

현재 서버의 프로토콜을 문

 setCharacterEncoding()

 현재 JSP로 전달되는 내용을 지정한 케릭터셋으로 변환해준다. ,HTML폼에서 한글 입력을 정상적으로 처리 해주려면 반드시 필요하다.


3) reponse

1. reponse 내장객체

 - reponse는 request와 반대되는 개념으로, 사용자 응답과 관련된 기능을 제공

 - 사용자 요청(request)을 처리하고 응답을 다른 페이지로 전달하는 등의 기능을 제공.

 - javax.servlet.http.HttpServletResponse 객체에 대한 참조변수로, request에 만큼 많이 사용되지는 않으나 setContentType,sendRedirect와 같은 메서드는 잘알아야한다.


reponse 주요 메서드

 메서드

설명 

 setContentType(type)

문자열 형태의 type에 지정된 MIME으로 content Type을 설정

setHeader(name,value) 

문자열 name의 이름으로 문자열 value의 값을 헤더러 세팅 

setDateHeader(name,date) 

문자열 name의 이름으로 date에 설정된 밀리세컨드 시간 값을 헤더에 설정

sendError(status,msg) 

오류코드를 세팅하고 메시지를 보냄 

 sendRedirect(url)

클라이언트 요청을 다른페이지로 보냄. 


4)out 

1. out내장객체 

 - out은 출력스트림으로써, 사용자 웹 브라우저로 출력하기 위한 내장 객체임.

 - 스트립트에서 브라우저로 덱스트를 출력하는 데 사용.

 - out은 javax.servlet.jspWriter객체의 참조변스로, 버퍼관련 메서드와 출력 관련 메서드로 구성되며, out를 이용해서 출력한 내용은 서버의 콘솔이 아닌 사용자에게 전달된다.


※out주요 메서드

 메서드

설명 

 getBufferSize()

output buffer의크기를 바이트로 알려준다. 

 getRemaining()

남아있는 버퍼의 크기중 사용가능한 비율을 알려준다. 

clearBuffer() 

 버퍼에 있는 콘텐트를 모두 지운다. 

flush() 

버퍼를 비우고 output stream도 비운다. 

close() 

output stream을 닫고 버퍼를 비운다 

println(content) 

content의 내용을 newline과 함께 출력한다.

print(content) 

content의 내용을 출력한다.



5)session 내장객체

 - HTTP프로토콜이 비연결형 프로토콜이기 때문에 출력된 다음에는 클라이언트와 연결이 끊어진다. 따라서 한번 로그인한 사용자가 로그아웃할 때 까지 페이지를 이동해도 보관해야 할 정보가 있다면 이에 대한 처리가 매우 곤란해진다.

 - 이러한 HTTP프로토콜 문제점을 해결하려고 나온 것이 쿠기와 세션이다.

 - session은 javax.servlet.http.Http Session 인터페이스 참조 변수 이다.

 - session은 접속하는 사용자 별로 따로 생성되며 일정시간 유지되고 소멸된다.

 - 이러한 세션의 특징을 이용해 setAttribute()메서드를 이용해 임의의 값을 저장해놓고 활용할 수 있다.

 - 세션이 주로 사용되는 경우

┌① 사용자 로그인 후 세션을 설정하고, 일정시간이 지난 경우 다시 사용자 인증을 요구 할 때.

├② 쇼핑물에서 장바구니 기능을 구현할 때.

└③ 사용자의 페이지 이동 동선 등 웹페이지 트래킹 분석 기능 등을 구현 할때. 


※ session내장객체 메서드

 메서드

설명 

 getId()

각 접속에 대한 세션 고유의 ID를 문자열 형태로 반환한다. 

getCreatingTime() 

세션 생성기간을 January 1,1970 GMT부터 long형 밀리세컨드 값으로 반환 한다. 

getLastAccessedTime() 

 현재세션으로 마지막 작업한 시간을 long형 밀리세컨드 값으로 반환한다.

getMaxInactiveInterval()

세션의 유지시간을 초로 반환한다. 이를통해 세션의 유효시간을 알수 있다.

setMaxInactiveInterval(t) 

세션의 유효시간을 t에 설정된 초 값으로 설정한다.

invalidate() 

 현재 세션을 종료한다. 세션과 관련된 값들을 모두 지워진다.

getAttribute(attr)

문자열 attr로 설정된 세션값을 java.lang.Object 형태로 반환한다.

setAttribute(name,attr)

 문자열 name으로 java.lang.Object attr을 설정한다.


그밖의 내장객체

1).config

 - 서블릿이 최초로 메모리에 적재될 때 컨터이너는 서블릿 초기화와 관련된 정보를 읽고 javax.servlet.ServletConfig 객체에 저장한다.

 - config는 바로 ServletConfig클래스에 대한 참조 변수로 web.xml에 설정된 초기화 파라미터를 참조하기 위한 용도로 사용할 수 있다.


※config 메서드

메서드 

설명 

getInitParameterNames() 

초기 매개변수 값들의 설정 이름을 열거 객체로 반환 한다. 

getInitParameter(name) 

문자열 name에 해당하는 초기화 매개변수 값을 반환한다. 


2)application 

 - application은 웹 애플리케이션(컨텍스트) 전체를 관리하는 객체로 application 객체를 통해 각 서블릿이나 JSP에서 공유하려고 하는 각종 정보를 

설정하고 참조할 수 있다.

 - application은 javax.servletContext객체에 대한 참조 변수로써, config 객체를 통해 생성한다.

ServletContext 객체는 컨터이너와 관련된 여러정보를 제공하며, application참조 변수를 통해서 서블릿이 실행되는 환경이나 서버 자원과 관련한 정보를 얻거나 로그파일을 기록하는 작업등을 수행한다.

 - application 내장객체는 일반적으로 톰캣의 시작과 종료 라이프사이클을 가진다.

 - 유형별로 많은 메서드를 제공하므로 주로 관리 기능의 웹 애플리케이션 개발에 유용하다.


※ 개발자를 위한 서버정보

 메서드

설명 

getServerInfo()

 JSP/서블릿 컨테이너의 이름과 버전을 반환한다.

getMajorVersion() 

컨테이너가 지원하는 서블릿 API의 주 버전정보를 반환한다. 

getMinorVersion() 

컨테이너가 지원하는 서블릿 API의 하위버전 정보를 반환한다. 


※서버 지원정보

메서드 

설명 

getMineType(filename) 

문자열  filename에 지정된 파일에 대한 MIME Typ을 반환한다.

getResource(path)

문자열 path에 지정된 자원을 URL객체로 반환한다. 

getResourceAsStream(path) 

문자열 path에 지정된 자원을 InputStream 객체로 반환한다.

getRealPath(path)

문자열Path에 지정된 자원을 파일시스템의 실제경로로 반환한다. 

getContext(path) 

문자열 path에 지정된 자원의 컨텍스트 정보를 반환한다. 

getRequestDispatcher(path) 

문자열 path에 지정된 자원을 위한 request dispatcher을 생성한다. 


※로그관련 정보

메서드 

설명 

 log(message)

문자열 message의 내용을 파일에 기록한다. 로그파일의 위치는 컨테이너에 따라 다르다.

log(message,exception) 

 예외 상황에 대한 정보를 포함하여 로그 파일에 기록한다.



※속성 관련 정보

 메서드 

설명 

 getAttribute(String name)

 문자열 name에 해당하는 속성 값이 있다면 Object형태로 가져온다. 따라서 변환 값에 대한 적절한 형 변환이 필요하다.

getAttributeNames() 

현재  application객체에 저장된 속성들의 이름을 열거 형태로 가져온다.

setAttribute(String name, Object Value)

 문자열 name이름으로 Object형 데이터를 저장한다. Object형이므로 자바 클래스 형태로도 저장 할 수 있다.

 removeAttribute(String name)

문자열 name에 해당하는 속성을 삭제한다.







'programing > JSP' 카테고리의 다른 글

데이터베이스 와 JDBC  (0) 2017.11.07
기본문법  (0) 2017.09.23
간단한 실습  (0) 2017.09.12
jsp개발환경 구축  (0) 2017.09.07

+ Recent posts

티스토리 친구하기