2016-11-04 2 views
1

getInstance()에 PBKDF2WithHmacSHA1을 전달할 때 계속 NoSuchAlgorithmExeception을받습니다.SecretKeyFactory가있는 NoSuchAlgorithmException

왜 이런 일이 발생합니까? 나는 수입품을 놓치고 있습니까?

import javax.crypto.*; 
import javax.crypto.spec.*; 
import java.security.SecureRandom; 
import java.util.Scanner; 
import java.security.spec.*; 
import java.security.AlgorithmParameters; 
import javax.crypto.SecretKeyFactory.*; 

class AES 
{ 
    static public String encrypt(String input, String password) 
    { 
     SecureRandom random = new SecureRandom(); 
     byte salt[] = new byte[8]; 
     random.nextBytes(salt); 

     SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
     KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 256); 
     SecretKey tmp = factory.generateSecret(spec); 
     SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES"); 

     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, secret); 
     AlgorithmParameters params = cipher.getParameters(); 
     byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV(); 
     byte[] ciphertext = cipher.doFinal(input.getBytes("UTF-8")); 

     String text = new String(ciphertext, "UTF-8"); 
     return text; 
    } 
} 

또한 SHA1 대신 SHA2를 사용할 수 있습니까?

+0

하는 오라클 JDK 또는 오픈 JDK를 사용하고이 코드를 사용? –

+0

Java Cryptographic Extension을 설치해야 할 수 있습니다. http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html#SunJCEProvider – pedrofb

답변

0

OpenJDK를 사용하는 경우 this 일 수 있습니다.

은 오픈 JDK 구현은 단지 "HMACSHA1"harcoded 다이제스트가있는 PBKDF2HmacSHA1Factory.java을 제공 않습니다 허용 된 대답은 상태. 필자가 테스트 한 바에 따르면 Oracle JDK는 그 점에서 다르지 않습니다.

당신이해야 할 일은 PBKDF2HmacSHA1Factory를 파생시키는 것입니다. (어서, 이 열려 있습니다!) 생성자에 매개 변수를 추가하십시오. 당신은 당신의 자신의 공급자를 만드는 혼란을 방지하고, 다음과 같이 당신의 공장을 초기화하고 사용할 수 있습니다 :

SHA2 사용 정보
PBKDF_SecretKeyFactory kf = new PBKDF_SecretKeyFactory("HmacSHA512"); 
KeySpec ks = new PBEKeySpec(password,salt,iterations,bitlen); 
byte key[] = kf.engineGenerateSecret(ks).getEncoded(); 

, this post은 당신이 찾고있는 무엇을해야 할 수도 있습니다.

public byte[] hash(String password) throws NoSuchAlgorithmException 
{ 
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");   
    byte[] passBytes = password.getBytes(); 
    byte[] passHash = sha256.digest(passBytes); 
    return passHash; 
} 
관련 문제