나는 데이터베이스에 비밀번호를 안전하게 저장하려고하는데 PBKDF2 기능을 사용하여 생성 된 해시를 저장하기로 결정했습니다. 나는 bouncy 성 라이브러리를 사용하여 이것을하고 싶지만 왜 JCE 인터페이스를 사용하여 작동시킬 수 있는지 알지 못한다 ... 문제는 3 가지 모드로 해시를 생성하는 것이다.
1. 사용 PBKDF2WithHmacSHA1 직접
3. 2 개 고유 값 결과 JCE
통해 탄력 성을 이용하여 탄력 성 API를 사용하는 일
(2)에 의해 제공되는 비밀 키 공장 : 하나의 공통 제와 두 번째 하나에있다. 내가 PBKDF2 내가 내가 탄력이 성 자바 문서에서 마지막으로 촬영 한 방법 "PBEWITHHMACSHA1"의 알고리즘으로 선택한 이유 때문에 즉 HMAC SHA1을 사용하여 구현되는 것을 알고Java에서 bouncycastle을 사용하는 PBKDF2
//Mode 1
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec keyspec = new PBEKeySpec("password".toCharArray(), salt, 1000, 128);
Key key = factory.generateSecret(keyspec);
System.out.println(key.getClass().getName());
System.out.println(Arrays.toString(key.getEncoded()));
//Mode 2
PBEParametersGenerator generator = new PKCS5S2ParametersGenerator();
generator.init(PBEParametersGenerator.PKCS5PasswordToUTF8Bytes(("password").toCharArray()), salt, 1000);
KeyParameter params = (KeyParameter)generator.generateDerivedParameters(128);
System.out.println(Arrays.toString(params.getKey()));
//Mode 3
SecretKeyFactory factorybc = SecretKeyFactory.getInstance("PBEWITHHMACSHA1", "BC");
KeySpec keyspecbc = new PBEKeySpec("password".toCharArray(), salt, 1000, 128);
Key keybc = factorybc.generateSecret(keyspecbc);
System.out.println(keybc.getClass().getName());
System.out.println(Arrays.toString(keybc.getEncoded()));
System.out.println(keybc.getAlgorithm());
: 여기
내 코드입니다 .com.sun.crypto.provider.SunJCE_ae
[-53, 29, 113, -110, -25, 76, 115, -127, -64, 74, -63, 102, 75, 81, -21, 74]
[-53, 29, 113, -110, -25, 76, 115, -127, -64, 74, -63, 102, 75, 81, -21, 74]
org.bouncycastle.jce.provider.JCEPBEKey
[14, -47, -87, -16, -117, -31, 91, -121, 90, -68, -82, -31, -27, 5, -93, -67, 30, -34, -64, -40]
PBEwithHmacSHA
어떤 아이디어 :
출력은 다음과 같다?
에 호환 내가 KDF 출력을 생성 할 수있는이 방법은 내가 "모드 3"가 무엇을하고 있는지 잘 모르겠지만, 나는 그것을 무시 것입니다. 당신이 요청한 것처럼 출력이 160 비트가 아니라 128입니다. 160 비트는 SHA-1 해시의 크기입니다. 휴대 성을 위해 "모드 1"을 고수 할 것입니다. – erickson
에릭슨에 동의합니다. "모드 3"을 사용해야 할 필요가 있습니까? 아니면 "모드 1"이 비밀번호를 안전하게 저장할 수 있습니까? 첫 번째 질문에 대한 좋은 질문입니다. –
실제로 필요는 없습니다. BouncyCastle의 PBEWITHHMACSHA1이 왜 똑같은 일을하지 않는지 이해하려고합니다. 그리고 저는 동의합니다. 이식성 문제 때문에 두 번째 방법을 선택하지 않겠습니다. –