尝试在c#
中获取哈希字符串时遇到问题。
我已经尝试了几个网站,但大多数网站都使用文件来获取哈希值。其他用于字符串的东西有点过于复杂。我找到了像这样的Web身份验证示例:
FormsAuthentication.HashPasswordForStoringInConfigFile(tbxPassword.Text.Trim(), "md5")
我需要使用哈希来创建一个包含更安全的文件名的字符串。我怎样才能做到这一点?
例:
string file = "username";
string hash = ??????(username);
我应该使用其他哈希算法而不是“md5”吗?
using System.Security.Cryptography;
public static byte[] GetHash(string inputString)
{
HashAlgorithm algorithm = SHA256.Create();
return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
}
public static string GetHashString(string inputString)
{
StringBuilder sb = new StringBuilder();
foreach (byte b in GetHash(inputString))
sb.Append(b.ToString("X2"));
return sb.ToString();
}
补充说明
获取用于密码存储目的的哈希字符串的最快方法是以下代码:
internal static string GetStringSha256Hash(string text)
{
if (String.IsNullOrEmpty(text))
return String.Empty;
using (var sha = new System.Security.Cryptography.SHA256Managed())
{
byte[] textData = System.Text.Encoding.UTF8.GetBytes(text);
byte[] hash = sha.ComputeHash(textData);
return BitConverter.ToString(hash).Replace("-", String.Empty);
}
}
备注:
sha
变量的创建重构为类字段;我并不完全理解你的问题的全部范围,但如果你需要的只是字符串的哈希值,那么很容易得到它。
只需使用GetHashCode方法即可。
像这样:
string hash = username.GetHashCode();
我认为你所寻找的不是散列而是加密。使用散列,您将无法从“散列”变量中检索原始文件名。使用加密,您可以,并且它是安全的。
有关.NET加密的更多信息,请参阅AES in ASP.NET with VB.NET。
//Secure & Encrypte Data
public static string HashSHA1(string value)
{
var sha1 = SHA1.Create();
var inputBytes = Encoding.ASCII.GetBytes(value);
var hash = sha1.ComputeHash(inputBytes);
var sb = new StringBuilder();
for (var i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString();
}