Java哈希密码不匹配

时间:2015-06-05 15:17:29

标签: java string hash

在Google中搜索并观看StackOverflow中的一些帖子(Java hashing passwordsHashing 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);

我删除了所有不需要的模型,视图和控制器。

谢谢大家。

1 个答案:

答案 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>