当我将PBKDF2WithHmacSHA1传递给getInstance()时,我一直收到NoSuchAlgorithmExeception。
为什么会这样。我错过了一些进口商品吗?
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;
}
}
还有一种方法可以使用SHA2代替SHA1吗?
答案 0 :(得分:0)
如果您使用的是OpenJDK,那么this可能就是您的情况。接受的答案表明:
OpenJDK实现只提供了一个 具有“HmacSHA1”摘要的PBKDF2HmacSHA1Factory.java被编码。 就我测试而言,Oracle JDK在这个意义上并没有什么不同。
你需要做的是派生出PBKDF2HmacSHA1Factory(来吧,它 是开放的!)并在其构造函数中添加一个参数。你可以避免 创建自己的提供商,只是初始化和使用你的 工厂如下:
PBKDF_SecretKeyFactory kf = new PBKDF_SecretKeyFactory("HmacSHA512"); KeySpec ks = new PBEKeySpec(password,salt,iterations,bitlen); byte key[] = kf.engineGenerateSecret(ks).getEncoded();
关于使用SHA2,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; }