PHP和C#MD5 crypt没有提供相同的输出?

时间:2015-05-06 15:29:57

标签: c# php encryption login crypt

这是人们在我的网站上注册时的加密:

$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#中使用什么函数来获得相同的输出?

4 个答案:

答案 0 :(得分:2)

因为您使用了两种完全不同的算法。在PHP中,您使用的是使用DES的crypt(),而在C#中,您使用的是MD5。他们永远不会产生相同的输出。如果您想要相同的输出,则应在PHP中使用md5()而不是crypt()

另外,不要使用MD5,它已被弃用。您现在应该至少使用SHA-2

答案 1 :(得分:1)

Inverse Navigation Property

http://php.net/md5

并在输入中添加随机盐是其中一部分问题。你每次都会得到不同的输入,因此会有不同的哈希输出。

答案 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#