如何在C#中复现一个与PHP SHA512相符的SHA512哈希值?

8

1
据我所知,PHP没有SHA-512的实现。你能否发布一下你正在使用的代码? - André Hoffmann
1
我错了。PHP似乎支持相当多的哈希函数:http://www.php.net/hash - André Hoffmann
但我仍然想看看您用来回答这个问题的代码。(抱歉评论中的垃圾信息:-D) - André Hoffmann
3个回答

16

试一下这个

using System.Security.Cryptography

public static string HashPassword(string unhashedPassword)
{
    return BitConverter.ToString(new SHA512CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes(unhashedPassword))).Replace("-", String.Empty).ToUpper();
}

2
简单、美好、小巧、快速,可以说是完美! - Polo
SHA612CryptoServiceProvider是一个可释放的对象吗?每次调用会泄漏服务提供程序实例吗? - James Hugard
现在有SHA-612了?我记得应该是512啊... ^_^ - r3wt
1
运行良好,但请注意,我必须在结尾处调用ToLower()而不是ToUpper()以实现与PHP的hash("sha512", $data)相同的结果。 - michalstanko

1

BitConverter工作得非常好...

var testVal = "asdasd";
var enc = new ASCIIEncoding();
var bytes = enc.GetBytes( testVal );

var sha = new SHA512Managed();
var result = sha.ComputeHash( bytes );

var resStr = BitConverter.ToString( result );
var nodash = resStr.Replace( "-", "" );

nodash.Dump();

(修复了512位哈希,抱歉:)


我不知道你的代码中是否只是一个打字错误,但他要求的是sha512而不是sha256。 - André Hoffmann

1
我刚刚花了几个小时尝试让.NET哈希函数与PHP的Crypt函数匹配。这并不好玩。
由于PHP实现的Crypt返回一个base64编码的字符串,并且不执行多个哈希迭代(例如,Crypt的默认值为5000),因此存在多个挑战。我无法使用几个库从.NET获得类似的输出,直到我找到了CryptSharp。它接受与PHP(或原始C)函数类似的盐(例如"$6$round=5000$mysalt")。请注意,没有尾随$,如果您不提供盐,则会自动生成一个随机盐。
您可以在这里找到CryptSharp: http://www.zer7.com/software.php?page=cryptsharp 良好的背景阅读材料: - http://www.akkadia.org/drepper/SHA-crypt.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接