首页 > 解决方案 > 如何在.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) 

解决方案是什么?

标签: asp.net-core.net-coreasp.net-core-2.0

解决方案


长话短说,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稍后读取存储的缓冲区,提取属性并对提供的密码进行散列,然后再检查存储和计算的散列


推荐阅读