我正在尝试编写一个可用于加密和存储用户密码的密码加密类。我想确保我正确地这样做。此代码工作正常,似乎生成加密密码,但我想在此处发布以获得一些反馈。对我来说,这是相当复杂的,而且我知道加密中的任何内容,很容易犯错,而不会意识到你正在制作错误。
这是我的代码:
public CipherHandler {
public String encryptPassword(char[] plaintext, String encoding) throws Exception {
MessageDigest msgDigest = null;
String hashValue = null;
/* Convert char array plaintext to byte array */
byte[] b = new byte[plaintext.length << 1];
for (int i = 0; i < plaintext.length; i++) {
b[i] = (byte) plaintext[i]; //will this work regardless of encoding?
}
try {
msgDigest = MessageDigest.getInstance("SHA-256");
msgDigest.update(b);
byte rawByte[] = msgDigest.digest();
hashValue = (new BASE64Encoder()).encode(rawByte);
} catch (NoSuchAlgorithmException e) {
System.out.println("No Such Algorithm Exists");
}
System.out.println(hashValue);
return hashValue;
}
}
此函数通常从Swing事件处理程序调用,用户将其密码输入到JPassword字段中,这就是我开始使用char []的原因。为了测试,我使用此代码来调用函数:
CipherHandler cp = new CipherHandler();
String initPW;
try {
initPW = cp.encryptPassword("welcome".toCharArray(), "UTF-8");
}
由于这是我第一次尝试,我想我忽略了一些东西。我对任何建议或评论感兴趣。不过,我确实有几个具体的问题:
当我将char []转换为byte []时,我不相信我这样做是正确的。我如何知道使用哪种编码?在这里,我把“UTF-8”放入,主要是作为占位符,但我担心在某些情况下可能会失败。
我已经读过在密码被消化后我应该使用salt和迭代,但我无法弄清楚如何做到这一点。有人可以就此提出建议吗?
我使用的是SHA-256。这是建议的算法吗?我也读过有关MD5的内容。是否有一种算法更适合密码加密?
感谢您的帮助。我很感激!
答案 0 :(得分:1)
通常,密码是通过散列而不是通过加密来存储的。
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest(password.getBytes("UTF-8"));
然后将新生成的哈希值与您存储在数据库中或任何位置的哈希值进行比较。
加密密码也是一个好主意 - 这是一个明文值,您可以在对密码进行散列之前将其附加到密码中。这使得某人更难以执行离线暴力攻击。
答案 1 :(得分:0)
MD5已经死了,UTF-8应该是您最不担心的。阅读this
当然,根据您加密密码的目的(取决于您获得的目标受众类型),如果您在安全堆栈交换中搜索的时间足够长,您可以找到答案的完整答案。
只需我0.02美元