首页 > 解决方案 > 如何在 Xamarin 中指定哈希算法?

问题描述

在 Windows 10 上的 Visual Studio 2019 中编程。来自 .NET Framowork 4.7.2 项目的 RFC 2898 编码过程。到 Xamarin.Form (.NET Standard 2.0) 。原处理如下

var salt = "abcdefg";
var passWord = "password";
var iterations = 5;
var saltbyte = System.Text.Encoding.UTF8. GetBytes(salt);
var Rfc2898 = new System.Security.Cryptography. Rfc2898DeriveBytes(passWord, saltbyte, iterations, System.Security.Cryptography. HashAlgorithmName.SHA256);

移植它会导致 Xamarin 出现错误,因为您无法指定哈希算法。您不能指定哈希算法。

var Rfc2898 = new System.Security.Cryptography. Rfc2898DeriveBytes(passWord, saltbyte, iterations);

如何在 Xamarin 中指定哈希算法?

使用www.DeepL.com/Translator翻译(免费版)

标签: c#xamarin

解决方案


.NET Standard 2.0 似乎没有为构造函数提供HashAlgorithmName参数。然而,它存在于 .NET Standard 2.1 中。您可以轻松地将库更改为使用 .NET Standard 2.1。

否则,您将不得不专门使用该平台。Xamarin.iOS 和 Xamarin.Android 确实有可用的构造函数。

所以我会创建一个服务来散列你的密码:

public interface IPasswordHasher
{
    byte[] GetHashedPassword(string password, string salt, int keySize);
}

然后在 Android 和 iOS 上实现它并将其注册为Xamarin.Forms DependencyService实例:

using System.Security.Cryptography;
using System.Text.Encoding;
using Xamarin.Forms;

[assembly: Dependency(typeof(MyAwesomeProject.iOS.Services.PasswordHasher))]

namespace MyAwesomeProject.iOS.Services
{
    public class PasswordHasher : IPasswordHasher
    {
        public byte[] GetHashedPassword(string password, string salt, int keySize)
        {
            var saltbyte = UTF8.GetBytes(salt);
            var rfc2898 = new Rfc2898DeriveBytes(password, saltbyte, 1000, HashAlgorithmName.SHA256);
            return rfc2898.GetBytes(keySize);
        }
    }
}

然后当您需要将其用作:

var bytes = DependencyService.Get<IDeviceOrientationService>().GetHashedPassword("password", "abcdefg", 20);

我强烈建议您为 PBKDF2 密钥派生使用 5 次以上的迭代。默认值为 1000,越高越好。当然,在移动设备上,您可能会遇到性能限制,但 5太低了


推荐阅读