在Google中搜索并观看StackOverflow中的一些帖子(Java hashing passwords,Hashing Password)。我尽量不重复问题并自己寻找答案,但是你可以理解,情况并非如此。
我在Java中使用SHA256算法创建一个简单的哈希密码库。
每次创建哈希时,生成的密码都不同。这种情况发生在SHA256和MD5算法中。
为什么会这样?我认为生成的密码应该是相同的。我可能完全错误并且对哈希如何工作感到困惑。
散列方法:
CipherString.java
public static String cipherPassword(String pwd, String salt) throws NoSuchAlgorithmException, UnsupportedEncodingException
{
MessageDigest d = MessageDigest.getInstance("SHA-256");
d.update(salt.getBytes("UTF-8"));
byte[] hash = d.digest(pwd.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for(int i=0; i< hash.length ;i++)
{
sb.append(Integer.toString((hash[i] & 0xff) + 0x100, 16).substring(1));
}
String pwdCifrada = sb.toString();
return pwdCifrada;
}
编辑:
旧的Main.java(错误的代码)
String username = txtUsername.getText();
char[] password = txtPassword.getPassword();
String hashedPassword = cipherPassword(password.toString(), username);
New Main.java(修复/解码的代码)
String username = txtUsername.getText();
char[] password = txtPassword.getPassword();
String hashedPassword = cipherPassword(new String(password), username);
我删除了所有不需要的模型,视图和控制器。
谢谢大家。
答案 0 :(得分:1)
我强烈建议您使用库来处理此问题。
考虑Apache Commons Codec库:
import org.apache.commons.codec.digest.DigestUtils;
public class HashTest {
public static String cipher(String pwd, String salt) {
return DigestUtils.sha256Hex(pwd+salt);
}
public static void main(String[] args) {
String p = "password";
String s = "randomSalt";
String c = cipher(p, s);
System.out.println(c);
}
}
这将始终打印
a0494b0d7ef89bba60f9703e2c438465cd1241cc440a8fc20f4330639d2c9c2f
如果您使用Maven管理您的依赖项,可以在此处查看最新版本:http://mvnrepository.com/artifact/commons-codec/commons-codec
或使用当前最新的:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>