如何在.net Core中加密和解密字符串

时间:2019-07-05 10:31:35

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

我将.net webapi移植到了.net core webapi。 在我的旧代码中,我使用

with data (j) as (
values ('{
  "data": [
    {
      "groupName": "TeamA",
      "groupCode": "12",
      "subGroupCodes": [
        "11"
      ]
    },
    {
      "groupName": "TeamB",
      "groupCode": "13",
      "subGroupCodes": [
        "15", "22"
      ]
    }
  ]
}'::jsonb)
)
select e ->> 'groupName' as group_name, 
       e ->> 'groupCode' as code,
       sg.*
from data d
  cross join lateral jsonb_array_elements(d.j -> 'data') as e(g)
  cross join lateral jsonb_array_elements_text(g -> 'subGroupCodes') as sg(subgroup_code)

为此,我正在使用库 Cryptographer.CreateHash("SHA1CryptoServiceProvider", strPass);

但是在移植到.net core之后,我面临的问题是:

Microsoft.Practices.EnterpriseLibrary.Security.Cryptography

对此有什么解决方案?

2 个答案:

答案 0 :(得分:0)

长话短说,EntLib是十年前创建的旧式库。不要使用它。它从未打算在.NET Core中使用,并且显然也从未升级过以使其可以使用。请改用KeyDerivation.Pbkdf2

在这种特定情况下,您不能完全使用EntLib,因为它试图使用不存在的属性AppDomain.SetupInformation。 AppDomain类was removed in the first versions of .NET Core并添加回i .NET Core 2.0。即使是现在,它也无法提供包括SetupInformation在内的所有成员。

如文档页面所述,此属性将重新添加到将于9月发布的.NET Core 3.0中。

real 解决方案是首先不要使用此类代码,而应使用ASP.NET Core的身份存储密码。

像这样用SHA1哈希密码很容易在几分钟内破解。当人们习惯于创建彩虹表,为所有密码组合预先计算出SHA1哈希并仅查找哈希以查找密码时,就可以追溯到过去。如今,仅仅强行使用它可能比搜索一大堆哈希表更快

ASP.NET始终提供更加安全的密码哈希和存储,其中包括添加盐分和多个哈希迭代。在ASP.NET Web窗体和MVC的较早版本中,使用了盐析和至少1000次哈希迭代。

ASP.NET Core Identity还提供安全的哈希和存储。使用它是最简单,最安全的选择。它是开源的,因此即使无法使用它,也很容易检查它如何对密码进行哈希处理。

HashPasswordV3方法使用ASP.NET Core的KeyDerivation类对用户提供的密码进行哈希处理。代码很简单。本质上,这是对KeyDerivation.Pbkdf2的调用,带有16字节的salt盐,该盐返回32字节的哈希缓冲区。

byte[] salt = new byte[16];
rng.GetBytes(salt);
byte[] subkey = KeyDerivation.Pbkdf2(password, salt, KeyDerivationPrf.HMACSHA256, 
                                     iterCount, 32);

其余代码将哈希算法ID,哈希字节,迭代计数和盐打包在一个字节数组中,以存储在表中。这些属性可以存储在表的不同列中,但是将所有内容放在单个byte []数组中会更方便。

稍后,VerifyHashedPasswordV3在检查存储和计算的哈希值之前,读取存储的缓冲区,提取属性并哈希提供的密码

答案 1 :(得分:0)

尝试一下

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DevExtremeAspNetCoreApp07052019.App_Start;


namespace DevExtremeAspNetCoreApp07052019.App_Start
{
    public class HelperClass
    {

        public static char Mid(string param, int startIndex, int length)
        {
            Char result = Convert.ToChar(param.Substring(startIndex, length));
            return result;
        }
        public static string Decrypt(string icText)
        {
            int icLen;
            string icNewText = "";
            char icChar;
            //icChar = '' ;
            icLen = icText.Length;
            for (int i = 0; i <= icLen-1; i++)
            {
                icChar = Mid(icText, i, 1);
                switch (Strings.AscW(icChar))
                {
                    case object _ when 192 <= Strings.AscW(icChar) && Strings.AscW(icChar) <= 217:
                        {
                            icChar = Strings.ChrW(Strings.AscW(icChar) - 127);
                            break;
                        }

                    case object _ when 218 <= Strings.AscW(icChar) && Strings.AscW(icChar) <= 243:
                        {
                            icChar = Strings.ChrW(Strings.AscW(icChar) - 121);
                            break;
                        }

                    case object _ when 244 <= Strings.AscW(icChar) && Strings.AscW(icChar) <= 253:
                        {
                            icChar = Strings.ChrW(Strings.AscW(icChar) - 196);
                            break;
                        }

                    case 32:
                        {
                            icChar = Strings.ChrW(32);
                            break;
                        }
                }
                icNewText = icNewText + icChar;
            }
           // icNewText = Microsoft.VisualBasic.StrReverse(icNewText);
            return (icNewText);
        }
        public static string Encrypt(string icText)
        {
            int icLen;
            string icNewText = "";
            char icChar;
            icLen = icText.Length;
            for (int i = 1; i <= icLen; i++)
            {
                icChar = Mid(icText, i, 1); 
                switch (Strings.AscW(icChar))
                {
                    case object _ when 65 <= Strings.AscW(icChar) && Strings.AscW(icChar) <= 90:
                        {
                            icChar = Strings.ChrW(Strings.AscW(icChar) + 127);
                            break;
                        }

                    case object _ when 97 <= Strings.AscW(icChar) && Strings.AscW(icChar) <= 122:
                        {
                            icChar = Strings.ChrW(Strings.AscW(icChar) + 121);
                            break;
                        }

                    case object _ when 48 <= Strings.AscW(icChar) && Strings.AscW(icChar) <= 57:
                        {
                            icChar = Strings.ChrW(Strings.AscW(icChar) + 196);
                            break;
                        }

                    case 32:
                        {
                            icChar = Strings.ChrW(32);
                            break;
                        }
                }
                icNewText = icNewText + icChar;
            }
            return (icNewText);
        }

        public static string ReplaceFirstOccurrence(string Source, string Find, string Replace)
        {
            string result = "";
            int Place = Source.IndexOf(Find);
            if (Place != -1)
            {
                result = Source.Remove(Place, Find.Length).Insert(Place, Replace);
            }
            else
            {
                result = Source;
            }
            return result;
        }

        public static string SQLString(string sStrings, Boolean Trim = true)
        {
            //Get
            //{

            if (Trim)
            {
                if (sStrings != null && sStrings.Trim() != "")
                    return ReplaceFirstOccurrence(sStrings.Trim(), "'", "''");
                else
                    return "";
            }
            else if (sStrings.Trim() != "")
                return ReplaceFirstOccurrence(sStrings, "'", "''");
            else
                return "";
            //}
        }

    }
}