c# - 如何在 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翻译(免费版)
解决方案
.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太低了。
推荐阅读
- regex - How to double escape double quotations marks using regex in a pair of double quotation marks
- vba - 始终返回 Outlook 收件人的 SMTP 电子邮件地址
- python - Sympy:求解具有初始条件误差的微分方程
- c# - EF ComplexType DbModelBuilder 字典示例
- firebase - Xamarin.Firebase.FirebaseDynamicLinks.instance 返回 NULL 是使用 Xamarin.Firebase.lid
- entity-framework - EF Code First 正在使用错误的列创建查询
- python - Create a column for Month from a column of date (however the date column does not contain the month information)
- mysql - 使用客户端连接到 docker 网络中的 mysql
- ios - 单击表格视图单元格内的 uicollectionview 单元格时继续
- spring-boot - Spring Data Rest 不会更新数据库中的默认值