我正在尝试比较来自网络服务的java中的密码。
我使用以下命令从命令行调用服务:
curl -d'[{“usr”:“joe”,“password”:“joe”}]'http://mydomain.com:8080/myservice/login
我解析JSON并将密码传递给哈希方法。
我的散列方法如下:
private String createHash(String password){
byte[] bytesOfMessage = null;
try {
bytesOfMessage = password.getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String thedigest = md.digest(bytesOfMessage).toString();
System.out.println("passed in: "+thedigest);
return thedigest;
}
问题是,每次使用完全相同的密码调用此方法时,打印的哈希值都不同。如何让密码以相同的哈希值出现,以便我可以比较密码并验证用户身份?
谢谢!
答案 0 :(得分:3)
digest()
方法返回byte[]
,而toString()
上的byte[]
方法正在打印字节的对象标识数组,而不是内容。通常,为了打印出byte []的结果,您需要将字节转换为可打印的字符串(通常使用十六进制编码或base64编码)。十六进制编码经常用于md5校验和example here。
答案 1 :(得分:0)
您可以尝试使用base64。我已经给出了示例
public String encrypt(String plaintext) throws Exception {
MessageDigest messageDigest = null;
String hash=null;
try{
messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(plaintext.getBytes("UTF8"));
byte[] raw = messageDigest.digest();
hash = new String(Base64.encode(raw));
}catch(Exception nsa){
throw new Exception();
}
return hash;
}