为了账号安全,请及时绑定邮箱和手机立即绑定

HashAlgorithm.Create 在 C# ASP.NET Core 2

HashAlgorithm.Create 在 C# ASP.NET Core 2

Go
梦里花落0921 2021-11-14 10:20:10
我有一个 ASP.Net MVC 项目,它在使用时运行良好HashAlgorithm,但我试图在 ASP.NET Core 2 中复制这个相同的项目,但出现以下错误:System.PlatformNotSupportedException HResult=0x80131539 消息=此平台不支持操作。Source=System.Security.Cryptography.Primitives StackTrace:在 System.Security.Cryptography.HashAlgorithm.Create(String hashName) 在 Hash.Program.EncodePassword(String pass, String salt)我的代码:public static string GeneratePassword(int saltlength) //length of salt{    const string chars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";    var randNum = new Random();    var passwordSalt = new char[saltlength];    for (var i = 0; i <= saltlength - 1; i++) {        passwordSalt[i] = chars[Convert.ToInt32((chars.Length) * randNum.NextDouble())];    }    return new string(passwordSalt);}public static string EncodePassword(string pass, string salt) //encrypt password{    byte[] bytes = Encoding.Unicode.GetBytes(pass);    byte[] src = Encoding.Unicode.GetBytes(salt);    byte[] dst = new byte[src.Length + bytes.Length];    Buffer.BlockCopy(src, 0, dst, 0, src.Length);    Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);    HashAlgorithm algorithm = HashAlgorithm.Create("MD5");    if (algorithm != null) {        byte[] inArray = algorithm.ComputeHash(dst);        var encodedPassword = Convert.ToBase64String(inArray);        return encodedPassword;    }    return pass;}有关如何修复此错误的任何建议?
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

此问题有一个github 问题,它提供了一种解决方法:

解决方法是调用 (HashAlgorithm)CryptoConfig.CreateFromName(string),但通常不鼓励直接调用 CryptoConfig。


查看完整回答
反对 回复 2021-11-14
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

要创建 MD5 哈希对象,请使用MD5.Create(). 使用 CryptoConfig 或HashAlgorithm.Create(String)处理动态需求的唯一原因。


查看完整回答
反对 回复 2021-11-14
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

正如其他答案中所指出的那样,使用 MD5 作为密码的散列算法并不是一个好主意,因为它太容易破解了。虽然说 MD5 通常不安全并不完全正确,但它对于密码散列是不安全的。

基本上是一个简单的散列问题,比如运行一次迭代太便宜了。这就是为什么命名Key Derivation Function用于此目的的原因。这个想法是您需要一个 CPU 密集型算法(具有多次迭代)来进行散列。虽然它对一个用户来说是相当透明的(比如 100 毫秒),但破解它的成本太高了。

.Net 已经内置了Rfc2898DerivedBytes。它不是最容易使用的类,所以我在这个类的基础上做了一个小库:SimpleHashing.Net

如果需要 .Net Standard,您可以直接使用它或仅使用代码。还没有时间将其编译为标准。


查看完整回答
反对 回复 2021-11-14
  • 3 回答
  • 0 关注
  • 317 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信