Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP中的密码哈希_C#_Hash_Uwp - Fatal编程技术网

C# UWP中的密码哈希

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

我在.net framework中有以下代码

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);
        }