2013. 3. 19. 00:42 java

암호화 솔트 salt

여기에 더 좋은 문서가 있네요.

http://helloworld.naver.com/helloworld/318732


패스워드를 해시값의 형식으로 저장하면 원래의 패스워드는 알 수 없게 되는 것으로 생각합니다만

현실에서는 여러 가지 방법으로 원래의 패스워드가 해독됨

 

패스워드를 20문자 이상의 난수로 하면 먼저 깨지는 일은 없을 거지만

편리성이 낮아 현실적이지 않음

현재 일반적으로 생각할 수 있는 8문자 정도의 패스워드에서 해시값으로부터 해석을 막는 방법이 필요

 

1 솔트 salt

 1) 솔트는 해시의 원래 데이터에 추가하는 문자열입니다. 솔트에 의해 보이는 패스워드를 길게

     하는 것과 함께 솔트를 유저마다 다른 것으로 하면 패스워드가 길더라도 다른 해시값을

     생성할수 있음, 솔트의 요건은 아래와 같음

   - 어느 정도의 길이를 확보, 솔트와 패스워드를 조합한 길이가 최소 20문자가 필요

   - 유저마다 다른 것으로 함

 2) 유저마다 다른 해시를 생성하는 접근법

   - 난수를 솔트로 사용함, 많은 교과서에 난수를 솔트로 하도록 권장하고 있습니다만 난수를 솔트로

      하는 경우 솔트를 해시값과 세트로 저장해야 할 필요가 있음, 솔트를 모르면 패스워드를 대조하는

      것이 불가능 하기 때문

   - 유저 ID를 입력으로 하는 함수에 의한 솔트를 생성

      유저ID를 입력으로 하면 함수를 솔트로 사용하는 방법은 솔트를 저장할 필요가 없는 장점이

      있어서 난수 솔트와 비교해서 결점이 없음

2 스트레칭 strectching

 

* php 소스를 자바로 포팅해야 하는데... 다음에 하자.

 

FIXEDSALT = bc578d1503dkxiwoldii9342903240320230239k438dfk

STRETCHCOUNT = 1000

 

 // 솔트를 생성함

function get_sal($id) {

return $id.pack('H*', FIXEDSALF); // 유저 ID와 고정 문자열을 연결

}

 

function get_password_hash($id, $pwd) {

$salt = get_salt($id);

$hash = ''; //해시의 초기값

for($i=0; i<STRECTCHCOUNT; $i++) {

$hash = hash('sha256', $hash, $pwd, #salt);    // 스트레칭

}

return $hash;

}

 

// 호출예

var_deup(get_password_hash('user1', 'pass1'));

 

pack 함수에 의해 16진수 문자열을 바이너리로 변경

 

2014년 8.8일 추가

PBKDF2 나 bcrypt 가장 낫다고 한다.

http://howtodoinjava.com/2013/07/22/how-to-generate-secure-password-hash-md5-sha-pbkdf2-bcrypt-examples/

 

 

 

 

'java' 카테고리의 다른 글

비밀번호 암호화 SHA256, Salt  (0) 2014.08.07
보안 인증 관련  (0) 2013.03.19
인증  (0) 2013.03.19
eval에서 발생하는 문제  (0) 2013.03.19
파일 접근에 발생하는 문제  (0) 2013.03.19
Posted by gt1000

블로그 이미지
gt1000

태그목록

공지사항

어제
오늘

달력

 « |  » 2024.3
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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함