Key Derivation Functions (PBKDF2)

Posted by ironmask84
2015. 6. 24. 13:34 컴퓨터공학/Security


2년 전 부터 정보 보안에 대한 관심이 많아 지면서,

최근에 또 회사 업무로 인해 아래 암호화 알고리즘에 대해 알아보았다.

PBKDF2 라는 해쉬 컨테이너 알고리즘 이다. (Password-Based Key Derivation Function)

PBKDF2의 기본 파라미터는 다음과 같은 5개 파라미터다.

DIGEST = PBKDF2(PRF, Password, Salt, c, DLen)
  • PRF: 난수(예: HMAC)
  • Password: 패스워드
  • Salt: 암호학 솔트 (32bit 이상 추천.. 어떤 기준??)
  • c: 원하는 iteration 반복 수 (1000번 이상 추천 어떤 기준??)
  • DLen: 원하는 다이제스트 길이

PBKDF2는 NIST(National Institute of Standards and Technology, 미국표준기술연구소)에 의해서 승인된 알고리즘이고, 미국 정부 시스템에서도 사용자 패스워드의 암호화된 다이제스트를 생성할 때 사용한다.

위에서 PRF라는 것이 약간 헷갈리는데, 해쉬 함수를 의미하는 것으로 보인다.

기존 많은 웹서비스들은  패스워드 저장 시, SHA-1 이나 MD5와 같은 hash 알고리즘을 이용해 DB에 저장하여, 개인 정보를 보호하였으나, 이 방법도 HW의 눈부신 발전에 의해 무차별 공격 (brute-force-attack) 에 취약해지므로, 이를 대체 하기 위한 대표적인 알고리즘이다.

오픈소스이며, 최근에 여러 웹서비스나 프로그램에서 인기있는 알고리즘으로 보임.

내가 생각한 기본적인 사용법의 이해는 아래와 같다.

디바이스 내에는 DIGEST와 Salt 가 저장될 것이며,
Password는 저장되어서는 안된다.

유저가 Password를 입력할 때마다,
저장된 salt를 이용해서 PBKDF2를 통해, Digest가 출력될 것이고,
그 놈이 저장되어 있는 Digeest와 일치하는지의 여부를 볼 것이다.

마지막으로 참고할 만한 사이트 2개를 소개합니다.

1. 위키 : http://en.wikipedia.org/wiki/PBKDF2

2. NHN개발자 사이트 : http://helloworld.naver.com/helloworld/318732

 

Time Stamp와 MD5

Posted by ironmask84
2013. 2. 4. 09:07 컴퓨터공학/Security


3번 문제를 풀기 위해 http://webgame.wowhacker.com/weblevel3/list.php로 접속합니다.


또 아까와 같은 게시판이 보이시죠? 이번에도 게시글을 하나씩 클릭해가며 살펴보도록 합시다.


1번 게시글을 클릭하자 오픈기념사진이란 파일이, 2번 게시글은 몸매짱, 3번 게시글은 Hint, 4번 게시글은 내사진, 5번 게시글은 비밀글 처리되어 내용을 볼 수 없습니다. 1~4번에 업로드된 파일들을 모두 다운로드 받아봅시다. 그러면 아래의 링크로 접속되어 다운로드 되는것을 확인하실 수 있습니다.



다시 게시글을 들어가봅시다. 게시글을 올린 날짜 옆에 숫자가 보이시죠? 게시글마다 각각 숫자가 서로 다릅니다.


1: 2006.10.18 09:05:25 0.25616200

2: 2006.10.19 10:01:05 0.57833500

3: 2006.10.20 12:05.19 0.78252100

4: 2006.10.20 18.24.43 0.65272100

5: 2006.10.22 15:49.52 0.85428900


. 뒤에 있는 숫자와 파일 뒤에 붙는 숫자가 일치하죠? 그리고 5번은 85428900이고 말이에요. 그럼 아래와 같이 유추할 수 있습니다.


http://webgame.wowhacker.com/weblevel3/down/############.85428900


그렇다면 앞에 있는 암호화된 값은 무엇을 의미할까요? 모두다 소문자와 숫자로 조합된 32자리의 값으로 MD5로 인코딩 됬다는걸 쉽게 알 수 있습니다. 한번 MD5로 디코딩을 해봅시다. 아래의 링크로 접속합시다.


링크: http://md5.web-max.ca/

[위 사이트에서 MD5 Encrypt시 입력한 값이 MD5 해쉬사전(데이터베이스, DB)로 넘어갑니다. Decrypt는 이 해쉬사전을 탐색하여 원본값을 가져오는 것입니다. 주민등록번호, 비밀번호 등 역시 이 데이터베이스 내에 남습니다.]


그런뒤에 하나하나 디코딩을 해봅시다.


1: b72776c5eb0c5a05a7188959a49e1f1b -> 1161129925

2: 28d805e190f11ba1da5283d494ee8492 -> 1161219665

3: b08e7acd151d17cbc5f205edf151d7e7 -> 1161313519

4: 779bbf24b15bb7cb0f6b51507f0615f4 -> 1161336283


이 값들은 바로 타임스탬프(Timestamp)값임을 알 수 있습니다. 타임스탬프란 1970.1.1 00:00:00 이후의 시간을 초로 환산하여 문자열로 나타낸 값으로, 아래의 링크로 접속하면 쉽게 시각->타임스탬프, 타임스탬프->시각 변환이 가능합니다.


링크: http://www.4webhelp.net/us/timestamp.php


Timezone는 GMT +9 Hours를 선택하고(우리나라의 표준시는 그리니치 표준시(GMT)보다 9시간 앞서므로 그렇습니다.), Timestamp에 아까 디코딩 된 값 4개를 넣어서 Convert to date를 누릅시다.


1: 1161129925 translates to Wednesday, October 18th 2006, 09:05:25 (GMT +9)

2: 1161219665 translates to Thursday, October 19th 2006, 10:01:05 (GMT +9)

3: 1161313519 translates to Friday, October 20th 2006, 12:05:19 (GMT +9)

4: 1161336283 translates to Friday, October 20th 2006, 18:24:43 (GMT +9)


게시글을 올린 시각이랑 일치하죠? 그렇다면, 여기서 한번더 유추할 수 있습니다. 게시글을 올린 시각을 타임스탬프값으로 변환하여 이를 MD5로 인코딩하면 .앞의 암호화 된 값이 나오므로, 비밀글을 올린 시각인 2006.10.22 15:49.52를 타임스탬프 값으로 변환해봅시다. Day엔 22, Month엔 10, Year엔 2006, Hour에는 15, Minute에는 49, Second에는 52, Timezone은 GMT +9 Hours를 택하고 Convert to a timestamp를 누릅니다. 그러면 아래와 같이 결과물이 출력됩니다.


Sunday, October 22nd 2006, 15:49:52 (GMT +9) translates to 1161499792


1161499792을 가지고, 아래의 사이트로 들어가서 MD5로 암호화 해줍시다.

링크: http://tools.web-max.ca/encode_decode.php


그럼 아래와 같은 값을 얻을 수 있습니다.

fb6e412cf733d6b9cdf777cbcafa35c3


이제 한번 조합해봅시다.

http://webgame.wowhacker.com/weblevel3/down/fb6e412cf733d6b9cdf777cbcafa35c3.85428900


위의 사이트로 들어가면 답이 나와있습니다.


Level3 key: iwantknowmoreMrjones!


즉 답은 'iwantknowmoreMrjones!' 입니다. 수고하셨습니다.

출처 : http://exynoa.tistory.com/108

 

자바 AES 128비트 암호화

Posted by ironmask84
2013. 2. 4. 09:05 컴퓨터공학/Security


String sKeyString = "";
String message = "this is just an example";

 

// 1. 128 비트 비밀키 생성    
KeyGenerator kgen = KeyGenerator.getInstance("AES");    
kgen.init(128);    
SecretKey skey = kgen.generateKey();

 

// 2. 비밀 키를 이렇게 저장하여 사용하면 암호화/복호화가 편해진다.    
sKeyString = Hex.encodeHexString(skey.getEncoded());

 

// 3. 암호화 수행 
SecretKeySpec skeySpec = new SecretKeySpec(skey.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(message.getBytes());
System.out.println("encrypted string: " + Hex.encodeHexString(encrypted));

 

// 4. 복호화 수행
cipher.init(Cipher.DECRYPT_MODE, skeySpec);   
byte[] original = cipher.doFinal(encrypted);    
String originalString = new String(original);    
System.out.println("Original string: " + originalString + " " + Hex.encodeHexString(original));

 

 

jar : commons-codec-1.6.jar

출처 : http://blog.naver.com/PostView.nhn?blogId=yunta8&logNo=100162235590&redirect=Dlog&widgetTypeCall=true

 

문자열을 SHA-512 방식으로 암호화(단방향 암호화 방식 : 예 로그인)

Posted by ironmask84
2013. 2. 4. 09:03 컴퓨터공학/Security


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

import java.security.*;
 
// 문자열을 SHA-512 방식으로 암호화
 
public String encrypt(String input) throws NoSuchAlgorithmException {
 
    String output = "";
 
   
 
    StringBuffer sb = new StringBuffer();
 
    MessageDigest md = MessageDigest.getInstance("SHA-512");
 
 
 
    md.update(input.getBytes());
 
    byte[] msgb = md.digest();
 
 
 
    for (int i = 0; i < msgb.length; i++) {
 
        byte temp = msgb[i];
 
        String str = Integer.toHexString(temp & 0xFF);
 
        while (str.length() < 2) {
 
            str = "0" + str;
 
        }
 
        str = str.substring(str.length() - 2);
 
        sb.append(str);
 
    }
 
   
 
    output = sb.toString();
 
   
 
    return output;

}
 


 

자바 데이터 암호화: DES, 3DES, AES, RSA, MD5, SHA1

Posted by ironmask84
2013. 2. 4. 09:02 컴퓨터공학/Security


* 스트림 암호화 방식

: Clear text를 encode한 것을 1문자씩 변환


* 블럭 암호화 방식

: Clear text를 정해진 블럭으로 나눈후 해당 블럭을 암호화


* 대칭키 암호화 방식(old)

: 암호화 키와 복호화 키가 동일


* 비대칭키 암호화 방식(new)

: 암호화키는 공개키, 복호화키는 비밀키, 대칭 암호화에 비해 속도가 느림

  주로 개인키를 교환하는 목적으로 많이 사용

  A와 B가 Data를 주고 받는다고 할때 :

  개인키로 암호화하면 공개키로만 풀 수 있다. 공개키로 암호화하면 개인키로만 풀 수 있다.

  A와 B 각각이 공개키/개인키 한쌍씩을 가지고 있으면서

  서로에게 공개키만 알려줌

  A -> B Data 전송시 :

  A는 B의 공개키로 Data를 암호화시켜서 B에게 전송

  Data를 받은 B는 자신의 개인키로 Data를 복호화.

  B는 A의 공개키로 return값을 암호화시켜서 A에게 전송

  return값을 받은 A는 자신의 개인키로 return값을 복호화.


* 메시지 다이제스트

: 원문에 일방향 해쉬 함수를 적용, 일정 길이의 유일한 문자열로 변환하는 방식

  복호화 불가능, 전자서명시 사용



- DES

블럭 암호화 방식, 대칭키 암호화 방식

텍스트를 64bit 단위로 나눠 56bit 키로 암호화하는 알고리즘


- 3DES

DES의 짧은 키를 보완한 방식(DES를 세번 적용)


- AES

블럭 암호화 방식, 대칭키 암호화 방식

텍스트를 128bit 단위로 블럭화

128bit, 182bit, 256bit의 키로 암호화


- RSA

블럭 암호화 방식, 비대칭키 암호화 방식

두 개의 큰 소수들의 곱과, 추가 연산을 통해 키 생성

가장 보편적으로 사용


- MD5

블럭 암호화 방식, 메시지 다이제스트

임의의 길이의 입력데이터를 128bit의 출력데이터로 변환

512비트 단위로 알고리즘 수행, 메시지 길이를 512bit 배수로 패딩 

단, 원래의 메시지 길이 입력을 위한 64bit는 남겨둬야함


- SHA1

블럭 암호화 방식, 메시지 다이제스트

임의의 길이의 입력데이터를 160bit의 출력데이터로 변환


(참조 http://minix.tistory.com/397)