java - SHA 哈希似乎无法正常工作

标签 java hash cryptography

我正在尝试构建一个简单的密码 validator ,其中使用 SHA-256 对密码进行哈希处理。

我在网上找到了几个计算器 ( http://onlinemd5.com/ ) 将“密码”散列为“5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8”

我尝试了几个其他密码并取得了预期的结果。

所以我尝试实现一组相当直接的代码(或者我是这么认为的)

String pswd="password";
String storedPswd="5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8";
//first as a byte[]

Arrays.equals(hashWord(pswd),storedPswd.getBytes("UTF-8") );
...
private byte[] hashWord(String word)     {
    try {
        return MessageDigest.getInstance("SHA-256").digest(word.getBytes("UTF-8"));
    } catch (Exception e)        {
       throw new BadCredentialsException("Could not hash supplied password", e);
    }
}

我也试过没有成功。

return storedPswd.toUpperCase().equals(DigestUtils.sha256Hex(password));

Apache 编解码器库 (v1.10) 和 Java 1.6 给了我:

113459EB7BB31BDDEE85ADE5230D6AD5D8B2FB52879E00A84FF6AE1067A210D3

代替

5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8

我错过了什么??

解决方案(输入错误):

更新的测试代码:

String passwordSHA="5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8";
String complexSHA="8849fb9b221ddec0117e2796d16929179accf3a6012f738e1ed6c11af9cc2081";
@Test
public void testDigest() throws InterruptedException{
    System.out.println("Starting Digest test");
    String complexPassword = "a7$h1UC8";
    try {
        Assert.assertTrue(authenticateUser(complexPassword, complexSHA));
        Assert.assertTrue(authenticateUser("password", passwordSHA));           
        Assert.assertTrue( hashWord(complexPassword).equals(complexSHA) );
    } catch (Exception e) {
        Assert.fail();
    }
}
public boolean authenticateUser(String word, String stored) throws Exception {
    String apache2Pswd = hashApache(word);
    System.out.println(apache2Pswd);                
    return stored.equals(apache2Pswd);
}
private String hashApache(String pswd){
    return DigestUtils.sha256Hex(pswd);     
}
public static String hashWord(String word) throws Exception{
    byte[] digest = MessageDigest.getInstance("SHA-256").digest(word.getBytes("UTF-8"));
    StringBuilder sb = new StringBuilder();
    for (byte b : digest) {
        sb.append(String.format("%02x", b));
    }
    System.out.println(sb.toString());
    return sb.toString();
}

结果:

Starting Digest test
8849fb9b221ddec0117e2796d16929179accf3a6012f738e1ed6c11af9cc2081
5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
8849fb9b221ddec0117e2796d16929179accf3a6012f738e1ed6c11af9cc2081

最佳答案

您发布的hashWord 方法不正确,无法编译(这是您的实际代码吗?);它没有返回值。

有了这个:

byte[] digest = MessageDigest.getInstance("SHA-256").digest("password".getBytes("UTF-8"));

for (byte b : digest) {
    System.out.printf("%02x", b);
}

我确实得到了预期的输出:

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

输出 113459eb7bb31bddee85ade5230d6ad5d8b2fb52879e00a84ff6ae1067a210d3 是您计算字符串 5e884898da28047151d0e56f8dc62927736 的 SHA-256 哈希时得到的结果03d0d6aabbdd62a11ef721d1542d8 而不是原始字符串 password

您正在计算包​​含哈希值的十六进制字符串的哈希值,而不是原始密码的哈希值。

关于java - SHA 哈希似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30945882/

相关文章:

java - 不断变化的JSlider,用户交互事件?

c++ - 我应该缓存用作哈希键的 STL 字符串的哈希码吗?

python-2.7 - 当使用 uuid5 而不是 sha1 时,碰撞概率是否相同?

cryptography - 可交换密码?

c# - 使用 C# 的 AES 加密

java - 如何在运行时扩展模块路径

java - 生成 JavaDocs?

arrays - 为什么将一个值附加到散列中的数组也会修改已分配给它的其他变量?

Java PBEwithMD5andDES解密问题

java - 获取空或 null SecurityContextHolder.getContext().getAuthentication()