如果我做的话
int keyLength = 160; // because SHA1 generates 160-bit hashes
int iterations = 20 * 1000; //standard is 2000 but let's be more secure here
KeySpec spec = new PBEKeySpec(password.toCharArray(), generateSalt(), iterations, keyLength);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] hash = keyFactory.generateSecret(spec).getEncoded();
如何将此哈希值转换为字符串,以便将其保存到数据库中?我尝试new String(hash, "UTF-8");
但这会产生格式错误的字符,如l��0\�w�c��Q�
。
答案 0 :(得分:5)
您需要将字节数组编码为Base64 string,然后在从数据库中读取时将其解码回字节数组。请注意,编码的字符串将比原始字节数组大约33%。
答案 1 :(得分:1)
如果你总是在你的应用程序中将你的密钥用作byte[]
,那么将它作为BLOB二进制对象本身保存在数据库中会好得多。您可以避免转换错误。