username | salt | pwdDigest
多了一个字段 - salt。用户在输入密码注册后,随机生成一个 salt,一定要是随机生成的。然后按照一定的混淆规则,将 salt 撒入到明文密码中,最后将加盐后的密码做消息摘要,将 salt 和密码的消息摘要传给服务器。服务器如何匹配用户密码是否正确呢?用户用同样的方式对原始密码加盐再生成摘要,发送给服务器,服务器匹配摘要。因为盐是随机生成的,不用每次都生成盐,盐可以存在本地或者服务器,加盐的规则只要不泄漏出去就行,这样的处理比简单的对密码摘要要安全很多。
public static String salt() {
Random random = new Random();
StringBuilder sb = new StringBuilder(16);
for (int i = 0; i < sb.capacity(); i++) {
sb.append(hex[random.nextInt(16)]);
}
return sb.toString();
}
private static String byte2HexStr(byte[] bytes) {
int len = bytes.length;
StringBuilder result = new StringBuilder();
for (int i = 0; i < len; i++) {
byte byte0 = bytes;
result.append(hex[byte0 >>> 4 & 0xf]);
result.append(hex[byte0 & 0xf]);
}
return result.toString();
}
}
执行输出: