2017-04-08 4 views
0

우리는 SecretKeyFactory.generateSecret 기능을 사용하여 PBKDF2 알고리즘을 사용하여 암호를 해싱하는에 않고 InvalidKeySpecException로 사망 : 프로덕션 서버에, 그러나,SecretKeyFactory.generateSecret이 같은 IBM 자바

final SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm); 
final PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, iterations, hashLength); 
final SecretKey secretKey = secretKeyFactory.generateSecret(keySpec); 
return secretKey.getEncoded(); 

모든 것이 잘 작동하는 것 같다, 이 IBM 자바에서 실행 중일 때, 그것은 java.security.spec.InvalidKeySpecException로 사망 : 는 비밀 키 생성 할 수 없습니다 :

Caused by: java.security.spec.InvalidKeySpecException: Could not generate secret key 
    at javax.crypto.SecretKeyFactory.generateSecret(Unknown Source) 
    at our.Implementation.doHash(Hasher.java:71) 
    ... 48 more 
Caused by: java.lang.RuntimeException: Error deriving PBKDF2 keys 
    at com.ibm.crypto.provider.PBKDF2KeyImpl.a(Unknown Source) 
    at com.ibm.crypto.provider.PBKDF2KeyImpl.<init>(Unknown Source) 
    at com.ibm.crypto.provider.PBKDF2HmacSHA1Factory.engineGenerateSecret(Unknown Source) 
    ... 50 more 

우리는 반복 횟수를 변경하려고 해시 크기를 생성하고, t 그는 소금 크기,하지만 아무것도 도움이되었습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

0

명백히 PBKDF2의 IBM Java 구현은 암호가 비어 있으면 안된다고 주장합니다. 이 경우, 구현은 예외를 throw합니다.

빈 암호는 논쟁의 여지가 있지만, 첫 번째 테스트 케이스는 정확히 그렇기 때문에 코드가 전혀 작동하지 않는 것처럼 보였습니다. 또한 엣지의 경우, 사용자가 빈 암호를 요구하지 않도록하는 검증이 이루어지지 않도록해야합니다. 그렇지 않으면 정상적으로 처리해야합니다.

정말로 빈 암호를 지원해야하는 경우 특별한 경우로 처리하거나 PBKDF2에 대한 입력이 결코 비어 있지 않도록 모든 암호를 표준화해야합니다. 그러나 보안을 손상시키지 않도록해야합니다.

마지막으로 모든 암호의 길이를 접두어로 지정하여 비어있는 암호가 비어 있지 않은 문자열로 끝나도록합니다. 좋아요 :

final String prefixedPassword = String.format(Locale.ROOT, "%08x%s", password.length(), password);