【问题标题】:SHA1 not producing same hash value for same string input?SHA1 不会为相同的字符串输入产生相同的哈希值?
【发布时间】:2016-08-17 06:30:30
【问题描述】:

我正忙于登录 JFrame,系统将要求用户输入用户名和密码。密码使用 SHA-1 散列并存储在 MySQL 中

我遇到的问题是,对于完全相同的密码字符串,输出并不一致。 我需要一个使用 SHA1 的哈希值,它会产生相同的输出,以便我可以根据数据库中的哈希值验证它,以证明用户输入了正确的密码。

这是我对 sha1 的编码。

try
        {
            String password = txtPassword.getPassword().toString();

            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(password.getBytes());

            byte byteData[] = md.digest();

            //convert the byte to hex format
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < byteData.length; i++) {
             sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
            }

            System.out.println("Hex format : " + sb.toString());


        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(this, e);
        }

上面的编码是否有问题会导致它为同一个字符串产生不同的输出。

【问题讨论】:

  • MessageDigest.getInstance("SHA-1");?
  • "MD5" 听起来不像会给你 SHA-1...
  • 谢谢,正确。抱歉,我尝试了许多不同的哈希算法。
  • @John 我在 ideone 中尝试了您的代码,它似乎工作正常。你确定输入是一样的吗? (可能尝试打印出我猜的密码)

标签: java mysql netbeans hash sha


【解决方案1】:

我一直在尝试不同的编码,我发现问题在于从 JPasswordField 获取密码。

我得到的为密码生成相同哈希的解决方案是我必须将一行从 String password = txtPassword.getPassword().toString(); 编辑到 String password = String.valueOf(txtPassword.getText());

我意识到问题在于将其作为字符串而不是值来读取。

感谢回复

【讨论】:

    【解决方案2】:
    String password = txtPassword.getPassword().toString();
    

    这个代码是什么?这很可能是问题所在,因为设置 password = "test" 会重复给您相同的结果。

    编辑:

    试试这个:String password = new String(txtPassword.getPassword());

    【讨论】:

    • 感谢您的回复。该行的原因是为了获取用户输入的密码。将从 JPasswordField 调用密码并将其存储在变量密码中。系统需要为此密码创建一个哈希值,如果哈希值与 MySQL 中的哈希值匹配,则用户将通过身份验证。
    • 您不想将其设为字符串,这就是 getPassword 返回 char[] 而不是字符串的原因。要处理密码,您需要使用字符,然后将数组归零。 Note
    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 2018-05-23
    • 2011-11-12
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多