2016-10-10 1 views
1

PBE를 사용하여 비밀 키를 생성하려하지만 SecretKeyFactory에 의해 생성 된 비밀 키는 입력 비밀번호와 정확히 같습니다. 다른 알고리즘, 반복 횟수 등을 시도했지만 여전히 동일하므로 여기에 단계가 빠져 있습니다.Java SecretKeyFactory 생성 키가 입력 비밀번호와 동일합니다.

public SecretKey generateKey(String password, String salt) { 
    char[] passChars = password.toCharArray(); 
    byte[] saltBytes = salt.getBytes(); 
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithHmacSHA256AndAES_128"); 
    PBEKeySpec keySpec = new PBEKeySpec(passChars, saltBytes, 2048, 128); 
    SecretKey secretKey = keyFactory.generateSecret(keySpec); 
    byte[] encodedKey = secretKey.getEncoded(); 
    System.out.println("key: " + new String(encodedKey)); 

    return new SecretKeySpec(encodedKey, "AES"); 
} 

편집 : 나는 알고리즘 "PBKDF2WithHmacSHA1"를 사용하는 경우 다음 생성 된 키 암호가 서로 다른,하지만 어떻게 정확하게 입력 암호와 동일 키를 생성하고 사용하고 알고리즘을 올?

+1

입력 데이터를 'SecretKey' 개체로 변환하는 것입니다. 여기에는 비밀 키 생성이 없습니다. – EJP

+0

@EJB 그러면 알고리즘, 반복 횟수, 키 크기 등을 지정하는 요점은 무엇입니까? 이러한 매개 변수는 암호화/해독 할 때 사용됩니까? – joe

+0

@joe 두 번째로 'Cipher # init'의 세 번째 매개 변수로 전달되어야합니다. 나는 또한 그것이 이상하다고 생각했다. 그러나 그것이 그것이있는 방식이다 (duh). –

답변

2

getEncoded() 아닌 암호화 키 자료를 호출 할 때 당신은 당신이 com.sun.crypto.provider.PBEKey의 인스턴스를 얻을 것이다의 SecretKeyFactory PBEWithHmacSHA256AndAES_128를 사용하여 SecretKey를 생성하고이 클래스는 (암호 일명) 원래의 "키"를 반환하는 "특별한 기능을"이있는 경우 . 그것이 올바르게 이해된다면 KeyFactory에 의해서가 아니라 Cipher 자체에 의해 키 파생이 이루어질 것입니다.

따라서 SecretKey 인스턴스를 SecretKeySpec 인스턴스로 변환해서는 안됩니다. 대신 올바른 암호 인스턴스에서 생성 된 SecretKey 인스턴스를 사용하십시오.

Cipher c = Cipher.getInstance("PBEWithHmacSHA256AndAES_128"); 
c.init(Cipher.ENCRYPT_MODE, secretKey);