C# UWP中的密码哈希
我在.net framework中有以下代码C# UWP中的密码哈希,c#,hash,uwp,C#,Hash,Uwp,我在.net framework中有以下代码 public string GetHashedPassword(string password, string salt) { byte[] saltArray = Convert.FromBase64String(salt); byte[] passArray = Convert.FromBase64String(password); byte[] salted = new byte[salt
public string GetHashedPassword(string password, string salt)
{
byte[] saltArray = Convert.FromBase64String(salt);
byte[] passArray = Convert.FromBase64String(password);
byte[] salted = new byte[saltArray.Length + passArray.Length];
byte[] hashed = null;
saltArray.CopyTo(salted, 0);
passArray.CopyTo(salted, saltArray.Length);
using (var hash = new SHA256Managed())
{
hashed = hash.ComputeHash(salted);
}
return Convert.ToBase64String(hashed);
}
我正在尝试为UWP应用程序创建一个等效的.net内核。这是我到目前为止所拥有的
public string GetHashedPassword(string password, string salt)
{
IBuffer input = CryptographicBuffer.ConvertStringToBinary(password + salt, BinaryStringEncoding.Utf8);
var hashAlgorithm = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha256);
var hash = hashAlgorithm.HashData(input);
//return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, hash);
}
最后一行,将缓冲区转换回字符串不起作用。我得到一个例外:
目标多字节代码页中不存在Unicode字符的映射
如何将缓冲区转换回字符串?我假设您希望获得base64格式的哈希密码,因为您在.net示例中这样做了。
要获得此信息,请更改:
CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, hash);
致:
因此,完整的方法如下所示:
public string GetHashedPassword(string password, string salt)
{
IBuffer input = CryptographicBuffer.ConvertStringToBinary(password + salt, BinaryStringEncoding.Utf8);
var hashAlgorithm = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha256);
var hash = hashAlgorithm.HashData(input);
return CryptographicBuffer.EncodeToBase64String(hash);
}
string
是UTF-16LE,但您正在请求BinaryStringEncoding.Utf8
。我不知道语言投影在这种情况下实现了什么样的转换,也不知道您为什么要求UTF-8。我必须承认,我没有想到这一点。仅仅使用哈希函数是不够的,仅仅添加一个salt对提高安全性几乎没有什么作用,加密哈希非常快。相反,使用随机盐在HMAC上迭代大约100ms,并使用散列保存盐。使用诸如PBKDF2
(又称Rfc2898DeriveBytes
)、password\u hash
/password\u verify
、Bcrypt
等函数和类似函数。关键是让攻击者花费大量时间通过暴力手段查找密码。保护您的用户很重要,请使用安全的密码方法。请注意,这是一种不安全的密码散列方法,不应使用,它会使用户面临风险。
public string GetHashedPassword(string password, string salt)
{
IBuffer input = CryptographicBuffer.ConvertStringToBinary(password + salt, BinaryStringEncoding.Utf8);
var hashAlgorithm = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha256);
var hash = hashAlgorithm.HashData(input);
return CryptographicBuffer.EncodeToBase64String(hash);
}