这是人们在我的网站上注册时的加密:
$salt = generateSalt();
$hashedPassword = crypt($userPass, $salt);
这是我的generateSalt
函数:
function generateSalt() {
$salt = uniqid(mt_rand(), true);
$salt = '$1$' . $salt;
return $salt;
}
当我用这个加密密码时,我得到了例如:
$ 1 $ $九二九九九四四二AK4yZPjnj6BKc9yj4CXKu1
但是当我使用此函数在C#上加密相同的密码时:
hashedPassword = GenerateMD5(uName, salt);
GenerateMD5功能:
public String GenerateMD5(String input, String salt)
{
Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input + salt);
System.Security.Cryptography.MD5Cng md5hashstring = new System.Security.Cryptography.MD5Cng();
byte[] hash = md5hashstring.ComputeHash(bytes);
string hex = BitConverter.ToString(hash).Replace("-", string.Empty);
return hex;
}
我得到了完全不同的输出。使用相同的密码和相同的盐,我得到这个输出:
9DE11D48C3F7DF1BF89FC76D755A2596
我应该在PHP和C#中使用什么函数来获得相同的输出?
答案 0 :(得分:2)
因为您使用了两种完全不同的算法。在PHP中,您使用的是使用DES的crypt()
,而在C#中,您使用的是MD5。他们永远不会产生相同的输出。如果您想要相同的输出,则应在PHP中使用md5()
而不是crypt()
另外,不要使用MD5,它已被弃用。您现在应该至少使用SHA-2
答案 1 :(得分:1)
答案 2 :(得分:1)
如果我是你,我会考虑改用password_hash。所有crypt
都能在一个漂亮,整洁的包装中为你服务,并随机加盐。
至于为什么你的功能不匹配,你在C#代码中使用MD5。我不是C#的专家,但你应该使用某种bcrypt哈希系统。有一个open source bcrypt for C#可能会帮助您。理论上,由于它们使用相同的系统,因此它们应该能够验证另一个系统,因为它们都将盐存储在字符串中。只需从字符串中取出盐,然后将密码和盐插入另一个,它们就应该匹配。
答案 3 :(得分:0)
这是Poul-Henning Kamp所谓的md5crypt,不要与MD5混淆。 Md5crypt首先用于保护FreeBSD密码免受强力攻击,但后来变得更加普遍。它被整合到GNU libc crypt()中,许多程序都有这个系统调用的接口,包括PHP,还有一些PHP开发人员使用它。 Md5crypt调用MD5不少于1000次使蛮力更难(但现在md5crypt is considered outdated by its author!)。我已经看到md5crypt的实现用于许多编程语言this one is for C#。