java - 每次生成不同的密码哈希

标签 java hash jetty

我正在研究保护我正在构建的 jetty 服务器的密码。我正在使用 Java 的 MessageDigest 类来散列密码。我创建了这个测试类,它工作正常:

    String hash = "<hashOfMyPassword";
    String pass = "<myPassword>";
    byte[] data = pass.getBytes();
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("SHA");
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    md.update(data);
    MessageDigest passMD = null;
    try {
        passMD = (MessageDigest) md.clone();
    } catch (CloneNotSupportedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    byte[] passHash = passMD.digest();
    System.out.println(passHash.toString().equals(hash));

但是当我将它移动到我的 jetty 服务器时,它开始表现得很奇怪。这是该方法:

public void handle(String s, Request req, HttpServletRequest hreq,
            HttpServletResponse hres) throws IOException, ServletException {
        hres.setContentType("text/plain");
        hres.setStatus(HttpServletResponse.SC_OK);
        req.setHandled(true);
        if (!running) {

            //Validate password
            String pass = hreq.getParameter("password");
            hres.getWriter().println(pass);
            byte[] data = pass.getBytes();
            MessageDigest md = null;
            try {
                md = MessageDigest.getInstance("SHA");
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            md.update(data);
            MessageDigest passMD = null;
            try {
                passMD = (MessageDigest) md.clone();
            } catch (CloneNotSupportedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            byte[] passHash = passMD.digest();
            hres.getWriter().println(passHash.toString());
            if (passHash.toString().equals(hash)) {
               //dostuff
            } else {
                hres.getWriter().println("invalid password");
            }
        } 
    }
}

(在任何人说话之前,我知道我传递的密码很奇怪,但这对这个项目来说没问题)

这与以前完全相同,但这次我总是得到不同的哈希值,而且密码永远不匹配。我两次传递相同的密码,第一次我得到类似“[B@33ab7e65”的密码,下一次我得到“[B@58eb5b4”。

顺便说一句,我正在使用 curl 访问服务器。

对正在发生的事情有什么想法吗?这真的很奇怪。

最佳答案

您正在使用 toString 将字节数组 passHash 转换为字符串。这实际上根本不是获取数组的内容——Java 对数组的 toString 实现毫无帮助,它只是打印出数组在内存中的位置地址的一部分。

不要用字符串相等来比较hash,直接比较!将 hash 也键入为字节数组,并使用 Arrays.equals() 进行比较。

Arrays.equals(passHash, hash)

关于java - 每次生成不同的密码哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27710041/

相关文章:

hibernate - NoClassDefFound错误: org/hibernate/cfg/Configuration

java - Android应用程序无法连接到外部apache mysql服务器

java - 当循环重新开始时,循环内的局部变量会被销毁吗?

javascript - 使用井号标签从下拉列表中预先选择一个项目

ruby - 如何有效地加入从 json 列表收到的 ruby​​ 散列

spring - Spring MVC错误404错误请求Kotlin

java - 使用 Terracotta 集群 COMET

java - 使用 Runtime.getRuntime 在 Android 上运行 shell 命令

java - 将 Java 应用程序连接到 Microsoft CRM 2013 或 2016 的方法

c# - 在全框架项目上实现 ASP.Net Core 身份 PasswordHash