我将.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
对此有什么解决方案?
答案 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 "";
//}
}
}
}