我正在研究保护我正在构建的 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/