2009-09-13 97 views
7

这个问题几乎不言自明。我搜索了很多网站,很多方法,尝试了很多编码,但我无法使它匹配。如何在C#中重现适合PHP SHA512的SHA512哈希?

我想使字符串“asdasd”匹配。 (http://www.fileformat.info/tool/hash.htm?text=asdasd

+1

PHP不具有SHA-512执行,据我所知。你可以发布你使用的代码吗? – 2009-09-13 23:11:06

+1

我错了。 PHP似乎支持相当多的哈希函数:http://www.php.net/hash – 2009-09-13 23:15:51

+0

但我仍然希望看到您用于回答此问题的代码。 (对不起,垃圾评论:-D) – 2009-09-13 23:17:50

回答

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 2010-07-06 12:33:01

+0

是不是SHA612CryptoServiceProvider是一个可丢弃的对象?这会在每次通话中泄漏服务提供商实例吗? – 2013-11-07 20:23:02

+0

现在有一个sha612?可能发誓它是512 ...^_^ – r3wt 2014-02-05 07:06:14

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位散列,抱歉:)

+0

我不知道这只是你的代码中的一个错字,但他要求的是sha512,而不是sha256。 – 2009-09-13 23:36:00

0

我只花了几个小时试图获得.NET哈希函数来匹配PHP的Crypt函数。不好玩。

这里面临着多重挑战,因为Crypt的PHP实现返回一个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