在我现有的系统中,我在php中使用以下算法对密码进行了哈希处理。
$userId = "testusername";
$password = "testpassword";
echo md5(sha1($userId).sha1($password));
上述Java中的等效方法是什么,因为我正在将php迁移到java。
当我尝试在谷歌搜索时,他们正在谈论MessageDigest方法。 在PHP中,我使用了inbuild md5()和sha1()函数
在java中,我发现了以下内容,但仍然不等同。
public static String sha1(String input) {
StringBuilder sb = null;
try{
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.reset();
md.update(input.getBytes());
byte[] bytes = md.digest();
sb = new StringBuilder();
for(int i=0; i< bytes.length ;i++)
{
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
}catch(RuntimeException | NoSuchAlgorithmException e){
throw new RuntimeException(e.getMessage());
}
return sb.toString();
}
public static String md5(String input) {
StringBuilder sb = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(input.getBytes());
byte[] bytes = md.digest();
sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
} catch (RuntimeException | NoSuchAlgorithmException e) {
throw new RuntimeException(e.getMessage());
}
return sb.toString();
}
}
答案 0 :(得分:0)
您可以尝试以下示例:
class Main {
public static void main(String[] a) throws UnsupportedEncodingException, NoSuchAlgorithmException {
String output, input = "ml";
MessageDigest md = MessageDigest.getInstance("md5");
byte[] digest = md.digest(input.getBytes("UTF-8"));
BigInteger bigInt = new BigInteger(1, digest);
output = bigInt.toString(16);
System.out.println(""+output);
}
}
同样,您也可以生成sha1,只需在"sha1"
函数中传递MessageDigest.getInstance();
。
答案 1 :(得分:0)
sha1($userId)+sha1($password)
完全错了。要在PHP中进行字符串连接,您需要sha1($userId).sha1($password)
您在PHP中看到的结果实际上是md5(8)
或c9f0f895fb98ab9159f51fd0297e236d
。这是因为$password
的SHA1以8开头。哈希的其余部分被丢弃。
这不能用作安全散列函数,因为碰撞太多。例如,密码12345
具有相同的哈希值。您应该要求用户重置密码并使用标准密码散列机制。