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


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
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from Crypto.Cipher import AES
from Crypto.Hash import SHA256 as SHA
 
class myAES():
    def __init__(self,keytext, ivtext):
        hash = SHA.new()
        hash.update(keytext.encode('utf-8'))
        key = hash.digest()
        self.key = key[:16#AES는 키 크기가 128,192,256bit, 암호화 블록크기는 128이다.
        #key를 128bit(16byte)로 만든다. 예를 들어 self.key = key[:24] -> 192bit(24byte) 키로 암호화 하고자 할 경우. self.key = key -> 256비트 크기로 암호화 하고자 할 경우
        
        hash.update(ivtext.encode('utf-8'))
        iv = hash.digest()
        self.iv = iv[:16]       # AES는 암호화를 수행하는 블록크기가 128비트이므로 초기화벡터는 16바이트 크기로 한다.
 
 
    '''
    def makeEnabled(self,plaintext)는 인자로 입력되는 plaintext의 크기가
    16byte배수가 아닐경우 문자 '0'을 plaintext끝에 추가하여 16byte배수로 만들고,
    이에 대한 정보를 헤더로 구성한 후 결과로 리턴.
    '''
    def makeEnabled(self,plaintext):
        fillersize = 0
        textsize = len(plaintext)
        if textsize % 16 != 0:
            fillersize = 16 - textsize % 16
 
        filler = '0'*fillersize
        header = '%d'%(fillersize)
        gap = 16-len(header)
        header += '#'*gap
        
        return header+plaintext+filler
 
    def enc(self,plaintext):
        plaintext = self.makeEnabled(plaintext)
        aes = AES.new(self.key,AES.MODE_CBC,self.iv)
 
        encmsg = aes.encrypt(plaintext)
        return encmsg
 
    '''
    decmsg의 처음 16바이트를 유니코드로 변환하고, 변수 header에 할당.
    split('#')으로 header를 '#'을 구분자로 분리, 분리된 값 중 첫번째를 정수로 변환하여 fillersize에 할당.
    fillersize는 원래 정보뒤에 추가한 문자 '0'의 개수 이므로 decmsg를 16에서 -fillersize까지 슬라이스하면 정보가 추출
    '''
    def dec(self,ciphertext):
        aes = AES.new(self.key,AES.MODE_CBC,self.iv)
        decmsg = aes.decrypt(ciphertext)
        header = decmsg[:16].decode()
        fillersize = int(header.split("#")[0])
        if fillersize != 0:
            decmsg = decmsg[16:-fillersize]
        else:
            decmsg = decmsg[16:]
        return decmsg
def main():
    keytext = 'doohyun'
    iv = '1234'
    msg = 'python35'
    #msg = 'python35ab'
    
    myCipher = myAES(keytext, iv)    
    ciphered = myCipher.enc(msg)     #  원문을 myAES 클래스안에 있는 암호화 하는 함수 enc()불러서 암호화 실행(원문 -> 암호화)
    deciphered = myCipher.dec(ciphered) # 원문을 myAES 클래스안에 있는 암호화 하는 함수 dec()불러서 복호화 실행(암호문 -> 복호화)
    print('원 문:\t%s' %msg)
    print('암호문 :\t%s' %ciphered)
    print('복호문 :\t%s' %deciphered)
main()
cs


결과


데이터 무결성

 - 데이터 무결성 검증을 위해 보편적으로 활용되는 도구는 해시함수 이다.

해시함수(Hash Function) : 임의의 길이를 가진 데이터를 고정된 길이의 데이터로 매핑하는 함수이다.


3DES와 AES를 구현하기 위해서 SHA256 해시 함수를 활용하였고, 3DES와 AES에서 'doohyun'은 사용자가 직접 지정한 암호키였으며, SHA256을 이용해 32바이트의 길이의 해시 값으로 바꾸었으며, 이 해시값을 암호화 알고리즘에 맞는 암호크기로 잘라 사용했습니다.


두개의 정보가 있을때, 두정보가 해시값이 동일하면 두정보는 동일하다고 판단할 수 있으나 거의 그럴 확률은 희박하다.

왜냐하면 SHA256의 경우 해시값의 종류가 2ⁿ(n = 256)이다. 


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

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

1. 주석

 - 주석은 프로그램 소스에 덱스트로된 간단한 설명문을 넣는것을 말한다.

 

 - C언어를 비롯한 대부분 프로그램 언어가 주석을 사용하기 위한 문법을 제공.

 

 - JSP특성상 java,HTML,JSP코드가 썩여있으므로 주석도 혼용해서 사용가능.

 

* HTML주석 : 일반적인 HTML문서에서 사용 가능한 주석으로 화면에는 보이지 않지만 브라우저 소스보기를 하면 내용이 노출된다.

 - 클라이언트로 전달되는 주석

<!-- 주석 -->

 

JSP주석 : JSP파일에서만 사용가능한 주석으로 브라우저 소스보기를 해도 내용이 노출되지 않는다.

- 클러이언트로 전달되지 않는 주석

<%-- 주석 --%>

 

2.지시어

 - 지시어(Directives)는 JSP파일의 속성을 기술하는 JSP문법

 - JSP컨테이너에게 해당 페이지를 어떻게 처리해야 하는지 전달하기 위한 내용을 담고 있다.

 - 지시어는 크게 page, include, taglib으로 나눌 수 있으며, 각각에서 다루는 속성이 다르다.

 

①page 

 - page지시어는 현재 JSP페이지를 컨테이너에서 처리하는 데 필요하 각종 속성을 기술하는 부분.

 - 보통 JSP페이지 맨 앞에 위치함.

 - 이클립스 개발도구에 의해서 JSP파일을 생성하는 경우 기본적인 page지시어는 자동으로 생성됨.

 속성

설명 

기본 설정 값 

 language

스크립트 언어의 유형을 정한다. 

java 

 import

JSP내에서 사용할 외부 자바 패키지나 클래스의 불러오기를 정한다. 

 -  

 session

세션의 사용유무를 정한다. 

true 

buffer 

버퍼의 크기를 정한다. 

8KB 

autoFlush 

버퍼의 내용을 자동으로 비운다. 

true 

isThreadSafe 

단일 스레드모델을 사용함으로써 동시성 제어

여부를 정한다. 

true

info 

JSP페이지에 대한 설명 

errorPage 

현재 페이지에서 오류가 발생할 경우 호출된 페이지를 지정.

isErrorPage 

오류만을 처리하는 페이지로 지정한다. 

false 

contentType

MIME형식 지정 및 케릭터셋을 설정

text/html:charset=ISO-8859-1

pageEncoding 

contentType와 동일한 기능 

ISO-8859-1 

extends 

현재 JSP페이지를 특정 클래스를 상속한 클래스로 작성 

 [표준스펙]

javaxservlet.jsp.Http.JspPage

[톰켓구현]

org.apache.jasper.runtime.Http.JSPBase

 

 

②import

 - import는 JSP스크립트 부분에서 자바클래스를 사용하는 경우 해당 클래스의 패키지에 대한 import설정으로 기본적으로 자바에서와 동일하다.

 - 다만 패키지 import구분을 " , "을 이용하거나 라인단위로 작성해야된다.

 

 

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

데이터베이스 와 JDBC  (0) 2017.11.07
JSP 내장객체  (0) 2017.10.01
간단한 실습  (0) 2017.09.12
jsp개발환경 구축  (0) 2017.09.07

jsp에 맞는 프로젝트를 생성해줘야 한다.

 

왼쪽 상단에 [File] - [New] - [Dynamic Web Project]를 눌러준다.

 

 

이러한 창이 뜬다. 프로젝트 이름은 원하는 이름을 넣고, 다음으로  Target runtime을 잡아 준다.

그러기 위해서는 New Runtime을 눌러준다.

 

 

이러한 창이 뜨면 Apache tomcat을 설정을 해준다. 현재 설치되었던 서버가 아파치 톰켓 9로 깔려있어서 9로 잡아주었으며, 어디설치되었는지에 대한 디렉토리까지 잡아줘야 한다.

 

그러구 나서 간단한 실습을 해봤다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
 
<center>
<h1> Hello World</h1>
<hr>
</center>
 
</body>
</html>
cs

 

위그림과 같이 하기위해서 소스는 이와 같다.

 

다음예제는 변수를 선언하여서 각각 나타내어 계산하는 프로그램이다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<center>
<h1>계산기 실습</h1>
<hr>
</center>
 
<%int a = 4, b = 2;%>
 
a = <%=a%>, b = <%=b%><br>
a + b = <%=a+b%><br>
a - b = <%=a-b%><br>
a * b = <%=a*b%><br>
a / b = <%=a/b%>
 
</body>
</html>
cs

 

 

이러하다. 근대 처음보았던 <% %>, <%= %>이거는 뭘까? 하고 인터넷을 찾아보았다.

 

선언문

<% 여기는 Jsp영역이고 여기서 선언되는 변수는 지역변수이다. 따라서 반드시 초기화가 필요하다. %>

<%! 여기는 메소드 전역변수등을 선언하는 선언문이다. %>

<%=  이거는 프린트로 출력된다. 변수를 출력할 때 주로 사용한다. %>

<%@ 페이지 지시어. 문서 전체에 적용되어야 할 내용이며 한글을 지원하려면 이 부분이 필요하다.%>

 

 

이제 자바문법을 부르기위해서는 뭘써야되구, 그리구 변수를 나타낼때는 어떤거를 해야되나에대해서 조금은 알것같다.

 

바로 이어지는 예제도 마찬가지이다.

 

1부터 20까지 더하는데 각각 더해지는 과정을 출력하도록 을 구현해 보았다.

 

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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<center>
<h1>1부터 n까지의 합</h1>
<hr>
</center>
<%
int i, result;
result = 0;
for(i=1;i<=20;i++){
    result += i;
    out.println("1부터"+i+"까지의 합 : "+result+"<br>");
}
 
 
%>
</body>
</html>
cs

 

소스코드는 이러하다. 그래서 결과값을 보았다.

 

 

 

 

 

 

 

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

데이터베이스 와 JDBC  (0) 2017.11.07
JSP 내장객체  (0) 2017.10.01
기본문법  (0) 2017.09.23
jsp개발환경 구축  (0) 2017.09.07

1)3DES(TripleDate Encryption Standard)

 - DES는 1970년대 IBM에서 파이스텔 블록구조에 기반하여 설계되고 개발된 56비트키  암호화 알고리즘이다.

1970년대에는 미국 국가안전보장국(NSA)의 중요한 정보들의 암호화를 위해 수정된 버전의 DES를 채택할 정도들의 암호화를 위해 수정된 버전의 DES를 채택할 정도로 인기있고 광법위하게 사용된 암호 알고리즘이었다.

하지만, 56비트라는 다소 크기가 작은 암호키로 인해 1999년 distributed.net에 의해 22시간 여만에 DES는 깨지게 된다.

 

현재는 컴퓨팅 파워가 비약적으로 발전함에 따라 암호해독 전용 하드웨어인 천만원대 Copacobana머신으로 1주일 정도면 DES를 깰정도가 되었습니다.

DES를 보완하여 대체한 것이 3DES(Triple DES)는 암호화를 위해 블록당 3번의 DES를 수행한다. 따라서 168비트 키 암호화 알골즘이며, DES의 핵심적인 알고리즘은 변경없이 적용 된 것이다. DES에 비해 보안적인 요소는 증가하였지만 성능은 저하되었다.

-참조 : 화이트해커를 위한 암호와 해킹-

 

 

2) Pycrypto 설치

 

 - Pycrypto(Python Cryptography Tookit)는 SHA256과 같은 해시 함수와 AES,DES,RSA등과 같은 다양한 알고리즘을 제공하는 파이썬 패키지이다.

 

https://pypi.python.org/pypi/pycrypto 에 들어가서 해당 라이브러리를 다운받는다.

 

② 다운 받은 후 압축을 푼다.

③ 컨맨드창을 띄워서 Pycrypto를 빌드합니다.

 

④ 윈도우 컨맨드창에서 Pycrypto를 설치한다.

 

 

3. 3DES구현

 

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from Crypto.Cipher import DES3
from Crypto.Hash import SHA256 as SHA
 
class myDES():
    def __init__(self, keytext, ivtext): # keytext : 3DES 암호키생성을 위한 문자열,ivtext : 초기화 백터를 위한 문자열
        hash = SHA.new()  # SHA256 객체를 만들고 hash에 할당.
        hash.update(keytext.encode('utf-8')) # SHA256 해시를 갱신. 
        key = hash.digest()    
        self.key = key[:24]
        
        hash.update(ivtext.encode('utf-8')) # 초기화 벡터를 위한 해시를 갱신
        iv = hash.digest()                  # 해시값을 얻음.
        self.iv = iv[:8]
        
 
    def enc(self, plaintext):  # plaintext에 담긴 문자열을 3DES로 암호화.
            
        plaintext = make8String(plaintext)
        des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)   # 암호화를 하기 위해 먼저 3DES 객체 생성 인자에는 암호키, 운영모드, 초기화 벡터    
        encmsg = des3.encrypt(plaintext)
        return encmsg
        
        
    def dec(self, ciphertext):
        des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)
        decmsg = des3.decrypt(ciphertext)        
        return decmsg
 
 
def make8String(msg):  # 인자로 입력되는 문자열 msg의 길이를 8바이트 배수로 만들기 위해 문자 '0'을 추가
                            # msg의 본래의 내용은 변경되지 않음.
    msglen = len(msg)
    filler = ''        
    if msglen%!= 0:
        filler = '0'*(- msglen%8)
            
    msg += filler
    
    return msg
        
 
def main():
    keytext = 'doohyun'
    iv = '1234'
    #msg = 'python35'
    msg = 'python35ab'
    
    myCipher = myDES(keytext, iv)    
    ciphered = myCipher.enc(msg)    
    deciphered = myCipher.dec(ciphered)
    print('원  문: %s' %msg)
    print('암호문: %s' %ciphered)
    print('복호문: %s' %deciphered)
 
main()    
 
cs

 

4. 결과

 

 - 결과를 보면 원문보다 복호문은 길이가 길다는것을 알수가 있다. 이것은 복호화 정보의 길이가 원래 정보와 다르다면 이는 복호화 된 파일이 위조 또는 변조되었다는것을 알 수 있다. 반드시 원래의 정보와 동일하다는 것을 보장해야 뒤탈이 없어야한다.

 

 

 

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

공개키 암호  (0) 2017.10.10
AES  (0) 2017.09.28
블록 암호  (0) 2017.09.08
카이사르 암호(시저 암호)  (0) 2017.09.07
단문 메시지 암호화 및 복호화  (0) 2017.09.05

+ Recent posts

티스토리 친구하기