您好我是Java的新手,我有以下问题:我正在尝试使用blowfish算法加密用户的密码,但是当我尝试将其解密回来检查身份验证时,它无法解密它出于某种原因。
public static String encryptBlowFish(String to_encrypt, String salt){
String dbpassword = null;
try{
SecretKeySpec skeySpec = new SecretKeySpec( salt.getBytes(), "Blowfish" );
// Instantiate the cipher.
Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
//byte[] encrypted = cipher.doFinal( URLEncoder.encode(data).getBytes() );
byte[] encrypted = cipher.doFinal( to_encrypt.getBytes() );
dbpassword = new String(encrypted);
} catch (Exception e) {
System.out.println("Exception while encrypting");
e.printStackTrace();
dbpassword = null;
} finally {
return dbpassword;
}
}
public static String decryptBlowFish(String to_decrypt, String salt){
String dbpassword = null;
try{
SecretKeySpec skeySpec = new SecretKeySpec( salt.getBytes(), "Blowfish" );
// Instantiate the cipher.
Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
//byte[] encrypted = cipher.doFinal( URLEncoder.encode(data).getBytes() );
byte[] encrypted = cipher.doFinal( to_decrypt.getBytes() );
dbpassword = new String(encrypted);
} catch (Exception e) {
System.out.println("Exception while decrypting");
e.printStackTrace();
dbpassword = null;
} finally {
return dbpassword;
}
}
当我调用decrypt函数时,它给出了以下错误: java.security.InvalidKeyException:缺少参数
有什么想法吗?谢谢
答案 0 :(得分:2)
你在这里犯了很多错误:
您正在将加密值转换为字符串。并非所有字节都是有效字符串。将字节直接存储在数据库中作为二进制blob,而不是字符串(或首先将其转换为十六进制或base64)。
你混淆盐和钥匙。你在代码中调用salt
的东西实际上是私钥。你根本没有真正的盐。
您正在加密密码。这意味着您需要在某个地方存储密钥(您无法将其存储在数据库中,或者任何窃取数据库的人都可以解密密码)。相反,你应该使用哈希。
即使这样,你也不应该以这种方式存储密码。即使你正确使用盐也没有。如今,即使在盐渍的情况下,也很容易破解简单的哈希密码。相反,使用bcrypt库或PBKDF2。
here are instructions for doing this correctly。请注意,如果您按照这些说明进行操作, 可以将密码存储为字符串(它已经为您正确转换)。