【问题标题】:Hashing password using salt使用盐散列密码
【发布时间】:2012-03-09 09:47:41
【问题描述】:

我正在使用盐生成密码的哈希值。我的代码:

  `String psw="hello";  
   String tobehashed="";
   tobehashed=salt+psw;
   MessageDigest md = MessageDigest.getInstance("SHA-256");
   byte[] digest = md.digest(tobehashed.getBytes());
   System.out.println("Digest:"+digest);` 

我通过以毫秒为单位提供种子作为当前时间来产生盐,我对盐没有任何问题(我得到随机值)但不管盐我得到相同的哈希值..

其实salt的目的是获取不同的hash值.. 这是我的输出; Random nubr:-2098016229(this keeps changing) Digest:[B@ca0b6(this remains same) 解决办法是什么??

【问题讨论】:

    标签: java hash passwords password-protection


    【解决方案1】:

    您正在打印出digest.toString() 的结果,在字节数组的情况下将字节转换为有意义的输出。它只打印[B(这是字节数组的代码)、@,然后是一个十六进制地址。当您获得更多 Java 经验时,您会经常看到此输出。

    您将需要使用循环来遍历摘要中的字节并单独打印它们。

    【讨论】:

    • 但是如果我以后需要比较hash值,我必须通过迭代一个循环来比较两个hash值。对吗???
    • @user1258724:请参阅*.com/questions/630808/… 以获得答案。
    【解决方案2】:

    B@ca0b6 不是字节数组的内容,它是 toString() 表示。迭代数组的字节并单独打印它们。

    【讨论】:

    • 但是如果我以后需要比较哈希值,我必须通过迭代循环来比较两个哈希值。正确吗???
    【解决方案3】:

    如果您打印任何引用变量,则 System.out.println() 函数运行来自对象类的 toString() 函数。 toString() 的输出显示通过 printf()..
    默认情况下 toString() 返回您的参考对象的 HaxCode 。
    如果要更改它,则必须在各自的 class. 中覆盖 toString()

    digest.toString();
    

    只打印十六进制地址。 所以你必须对数组的字节使用迭代并单独打印它们......

    【讨论】: