Как зашифровать и расшифровать строку в ядре .net - PullRequest
0 голосов
/ 05 июля 2019

Я портировал свой .net webapi на .net core webapi. В моем старом коде я использовал

Cryptographer.CreateHash("SHA1CryptoServiceProvider", strPass);

Для этого я использовал библиотеку Microsoft.Practices.EnterpriseLibrary.Security.Cryptography

Но после портирования на ядро ​​.net я сталкиваюсь с проблемой:

{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) 

Какое решение для этого?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Попробуйте это,

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 "";
            //}
        }

    }
}
0 голосов
/ 05 июля 2019

Короче говоря, EntLib - это устаревшая библиотека, созданная более десяти лет назад. Не используйте это. Он никогда не предназначался для использования в .NET Core и, очевидно, никогда не обновлялся для работы с ним. Вместо этого используйте KeyDerivation.Pbkdf2 .

В этом конкретном случае вы не можете вообще использовать EntLib, потому что он пытается использовать несуществующее свойство, AppDomain.SetupInformation . Класс AppDomain был удален в первых версиях .NET Core и добавлен обратно в .NET Core 2.0. Даже сейчас он не предлагает всех участников, включая SetupInformation.

Как объясняется на странице документации, это свойство будет добавлено обратно в .NET Core 3.0, которое должно быть выпущено в сентябре.

Решение real состоит в том, чтобы вообще не использовать такой код и использовать удостоверение ASP.NET Core для хранения паролей.

Хеширование пароля с помощью SHA1, как это, тривиально сломать за минуты, если не меньше. В прошлом, когда люди создавали радужные таблицы, предварительно рассчитывали хеш-значения SHA1 для всех комбинаций паролей и просто искали хеш-код, чтобы найти пароль. В настоящее время, вероятно, на 1020 * быстрее просто перебор, чем поиск по большой таблице хэшей.

ASP.NET всегда предоставлял гораздо более безопасное хеширование паролей и хранилище, которое включало в себя засолку и множественные итерации хеша. В ASP.NET Web Forms и более ранних версиях 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);

Остальная часть кода упаковывает идентификатор алгоритма хеширования, байты хеша, количество итераций и соль в одном байтовом массиве для хранения в таблице. Эти атрибуты могут храниться в разных столбцах таблицы, но удобнее помещать все в один массив byte [].

Позже VerifyHashedPasswordV3 считывает сохраненный буфер, извлекает атрибуты и хеширует предоставленный пароль перед проверкой сохраненных и вычисленных хэшей

...