asp.net-core - 如何在.net核心中加密和解密字符串
问题描述
我将 .net webapi 移植到 .net core webapi。在我使用的旧代码中
Cryptographer.CreateHash("SHA1CryptoServiceProvider", strPass);
为此,我正在使用库
Microsoft.Practices.EnterpriseLibrary.Security.Cryptography
但是在移植到 .net core 之后,我遇到了问题:
{System.MissingMethodException: Method not found: 'System.AppDomainSetup System.AppDomain.get_SetupInformation()'.
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.SystemConfigurationSource.SafeGetCurrentConfigurationFile()
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceFactory.Create()
at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.SetCurrentContainerIfNotSet()
at Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Cryptographer.GetHashProvider(String hashInstance)
at Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Cryptographer.CreateHash(String hashInstance, String plaintext)
at Social27Bot.DAL.Data.Mappers.Security.EncryptPass(String strPass)
解决方案是什么?
解决方案
长话短说,EntLib 是一个十多年前创建的遗留库。不要使用它。它从未打算在 .NET Core 中使用,并且显然从未升级以使用它。请改用KeyDerivation.Pbkdf2。
在这种特定情况下,您根本不能使用 EntLib,因为它试图使用不存在的属性AppDomain.SetupInformation。AppDomain 类在 .NET Core 的第一个版本中被删除,并在.NET Core 2.0 中重新添加。即使是现在,它也不提供所有成员,包括SetupInformation
.
正如文档页面所解释的,这个属性将被重新添加到 .NET Core 3.0 中,该属性将于 9 月发布。
真正的解决方案是一开始就不使用这样的代码,而是使用 ASP.NET Core 的 Identity 来存储密码。
像这样使用 SHA1 散列密码是微不足道的,即使不是更少,也可以在几分钟内破解。早在人们用来创建彩虹表的时候,就会为所有密码组合预先计算 SHA1 哈希值,然后只需查找哈希值即可找到密码。如今,暴力破解它可能比搜索一个大的哈希表更快。
ASP.NET 总是提供更安全的密码散列和存储,包括加盐和多次散列迭代。在 ASP.NET Web 窗体和旧版本的 MVC 中,使用了加盐和至少 1000 次哈希迭代。
ASP.NET Core Identity 还提供安全的散列和存储。使用它是最简单和最安全的选择。它是开源的,所以即使不能使用它,也很容易检查它是如何散列密码的。
HashPasswordV3方法使用 ASP.NET Core 的KeyDerivation类来散列用户提供的密码。代码非常简单。本质上,它是对 KeyDerivation.Pbkdf2 的调用,带有一个 16 字节的盐,返回一个 32 字节的哈希缓冲区。
byte[] salt = new byte[16];
rng.GetBytes(salt);
byte[] subkey = KeyDerivation.Pbkdf2(password, salt, KeyDerivationPrf.HMACSHA256,
iterCount, 32);
其余代码将散列算法 ID、散列字节、迭代计数和盐值打包在一个单字节数组中,以便存储在一个表中。这些属性可以存储在表的不同列中,但将所有内容放在单个 byte[] 数组中更方便。
VerifyHashedPasswordV3稍后会读取存储的缓冲区,提取属性并对提供的密码进行散列,然后再检查存储和计算的散列
推荐阅读
- python - Python 怎么来 ConnectionResetError -> 重新连接 -> 在第一条消息上监听消息
- javascript - Vue:将插槽内的所有数据读/写为一个
- html - 如何为输入框设置颜色
- java - 如何将图像从 URL 调整为 JPanel
- python - 以编程方式删除 Python 中的所有蓝牙设备
- reactjs - Heroku 持续集成 (CI) 未能通过 react-scripts 构建
- c++ - 在双向链表中删除小于给定值的值
- python - 将图像加载到 `np.array` 中,强制 `0..255` RGB 值到 `0.00..1.00` 浮点值?
- r - R Difference between source and load
- python - 使用 Django SafeString 支持实现类似 f-string 的语法