【发布时间】:2014-12-31 02:07:17
【问题描述】:
我正在使用密码保护我正在构建的码头服务器。我正在使用 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));
但是当我将它移到我的码头服务器时,它开始表现得很奇怪。方法如下:
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 顺便访问服务器。
对正在发生的事情有任何想法吗?这真的很奇怪。
【问题讨论】:
-
全班第一。它是私有的静态字符串哈希。我事先生成了它。
-
通过简单的散列来保护密码无效,我建议你改用
PBKDF #2、Bcrypt或Scrypt这样的算法。 Java 本身包含对PBKDF #2的支持,其他的可以通过完善的公共库(例如 Bouncy Castle)获得。