20230908
This commit is contained in:
parent
2106429d0a
commit
6966acaeb3
56
anbs_cp/Classes/Encrypt/PasswordEncrypt.cs
Normal file
56
anbs_cp/Classes/Encrypt/PasswordEncrypt.cs
Normal file
@ -0,0 +1,56 @@
|
||||
using System.Text;
|
||||
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
using Microsoft.AspNetCore.Cryptography.KeyDerivation;
|
||||
|
||||
namespace anbs_cp.Classes.Encrypt;
|
||||
|
||||
/// <summary>
|
||||
/// Класс шифрования пароля
|
||||
/// </summary>
|
||||
public sealed class PasswordEncrypt: IEncryptor
|
||||
{
|
||||
/// <summary>
|
||||
/// Шифрование пароля
|
||||
/// </summary>
|
||||
/// <param name="password">Пароль</param>
|
||||
/// <param name="salt">Хэш-код пароля</param>
|
||||
/// <returns>Зашифрованный пароль</returns>
|
||||
public string Encrypt (string password, string salt)
|
||||
{
|
||||
// Получаю byte-массив из хэш-кода пароля
|
||||
byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
|
||||
|
||||
// Шифрую пароль
|
||||
byte[] encryptedPassword = KeyDerivation.Pbkdf2(password, saltBytes, KeyDerivationPrf.HMACSHA512, 5000, 64);
|
||||
|
||||
// Возвращаю зашифрованный пароль
|
||||
return Convert.ToBase64String(encryptedPassword);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Этот метод не требует реализации в этом классе!
|
||||
/// </summary>
|
||||
/// <param name="encryptedValue">НЕ РАБОТАЕТ</param>
|
||||
/// <param name="salt">НЕ РАБОТАЕТ</param>
|
||||
/// <returns>НЕ РАБОТАЕТ</returns>
|
||||
/// <exception cref="NotImplementedException">Этот метод не требует реализации в этом классе!</exception>
|
||||
public string Decrypt (string encryptedValue, string salt) => throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
|
||||
|
||||
/// <summary>
|
||||
/// Этот метод не требует реализации в этом классе!
|
||||
/// </summary>
|
||||
/// <param name="text">НЕ РАБОТАЕТ</param>
|
||||
/// <returns>НЕ РАБОТАЕТ</returns>
|
||||
/// <exception cref="NotImplementedException">Этот метод не требует реализации в этом классе!</exception>
|
||||
public string Base64UrlEncode (string text) => throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
|
||||
|
||||
/// <summary>
|
||||
/// Этот метод не требует реализации в этом классе!
|
||||
/// </summary>
|
||||
/// <param name="text">НЕ РАБОТАЕТ</param>
|
||||
/// <returns>НЕ РАБОТАЕТ</returns>
|
||||
/// <exception cref="NotImplementedException">Этот метод не требует реализации в этом классе!</exception>
|
||||
public string Base64UrlDecode (string text) => throw new NotImplementedException("Этот метод не требует реализации в этом классе!");
|
||||
}
|
@ -1,56 +1,17 @@
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
namespace anbs_cp.Classes.Encrypt;
|
||||
namespace anbs_cp.Classes.Encrypt;
|
||||
|
||||
/// <summary>
|
||||
/// Класс для шифровки строк
|
||||
/// Статическая обертка для класса шифровки строк StringEncryptor
|
||||
/// </summary>
|
||||
public static class StringEncrypt
|
||||
{
|
||||
/// <summary>
|
||||
/// Получение ключа из строки
|
||||
/// </summary>
|
||||
/// <param name="s">Ключ-строка</param>
|
||||
/// <param name="salt">Хэш-ключ</param>
|
||||
/// <returns>Ключ</returns>
|
||||
private static byte[] KeyFromString (string s, byte[] salt)
|
||||
{
|
||||
// Создаю хэшер
|
||||
using Rfc2898DeriveBytes hasher = new(s, salt, 1000, HashAlgorithmName.SHA256);
|
||||
|
||||
// Получаю ключ
|
||||
return hasher.GetBytes(32);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Метод для шифрования строки <paramref name="text"/>
|
||||
/// </summary>
|
||||
/// <param name="text">Строка, которая должна быть зашифрована</param>
|
||||
/// <param name="key">Ключ</param>
|
||||
/// <returns>Этот статический метод возвращает зашифрованную строку <paramref name="text"/></returns>
|
||||
public static string Encrypt (string text, string key)
|
||||
{
|
||||
// Создаю криптограф
|
||||
using Aes aes = Aes.Create();
|
||||
|
||||
// Получаю ключ
|
||||
aes.Key = KeyFromString(key, aes.IV);
|
||||
|
||||
// Открываю поток
|
||||
using MemoryStream ms = new();
|
||||
|
||||
// Пишу данные в поток
|
||||
ms.Write(aes.IV);
|
||||
|
||||
// Создаю шифрованный поток
|
||||
using (CryptoStream cs = new(ms, aes.CreateEncryptor(), CryptoStreamMode.Write, true))
|
||||
// Пишу данные в него
|
||||
cs.Write(Encoding.UTF8.GetBytes(text));
|
||||
|
||||
// Возвращаю зашифрованный текст
|
||||
return Convert.ToBase64String(ms.ToArray());
|
||||
}
|
||||
public static string Encrypt (string text, string key) => new StringEncryptor().Encrypt(text, key);
|
||||
|
||||
/// <summary>
|
||||
/// Метод для дешифрования строки <paramref name="text"/>
|
||||
@ -58,63 +19,19 @@ public static class StringEncrypt
|
||||
/// <param name="text">Строка, которая должна быть дешифрована</param>
|
||||
/// <param name="key">Ключ</param>
|
||||
/// <returns>Этот статический метод возвращает дешифрованную строку <paramref name="text"/></returns>
|
||||
public static string Decrypt (string text, string key)
|
||||
{
|
||||
// Открываю поток в памяти
|
||||
using MemoryStream ms = new(Convert.FromBase64String(text));
|
||||
|
||||
// Задаю ключ
|
||||
byte[] iv = new byte[16];
|
||||
|
||||
// Читаю его
|
||||
_ = ms.Read(iv);
|
||||
|
||||
// Создаю криптограф
|
||||
using Aes aes = Aes.Create();
|
||||
|
||||
// Получаю ключ
|
||||
aes.Key = KeyFromString(key, iv);
|
||||
|
||||
// присваиваю ключ
|
||||
aes.IV = iv;
|
||||
|
||||
// Создаю поток дешифратора
|
||||
using CryptoStream cs = new(ms, aes.CreateDecryptor(), CryptoStreamMode.Read, true);
|
||||
|
||||
// Задаю поток итогового текста
|
||||
using MemoryStream output = new();
|
||||
|
||||
// Копирую данные в выходной поток
|
||||
cs.CopyTo(output);
|
||||
|
||||
// Вывожу расшифрованный текст
|
||||
return Encoding.UTF8.GetString(output.ToArray());
|
||||
}
|
||||
public static string Decrypt (string text, string key) => new StringEncryptor().Decrypt(text, key);
|
||||
|
||||
/// <summary>
|
||||
/// Декодирует зашифрованную строку в HTML-пригодный формат
|
||||
/// </summary>
|
||||
/// <param name="text">Зашифрованная строка</param>
|
||||
/// <returns>Этот статический метод возвращает дешифрованную строку <paramref name="text"/></returns>
|
||||
public static string Base64UrlEncode(string text) => text.TrimEnd('=').Replace('+', '-').Replace('/', '_');
|
||||
public static string Base64UrlEncode (string text) => new StringEncryptor().Base64UrlEncode(text);
|
||||
|
||||
/// <summary>
|
||||
/// Раскодирует из декодированной строки в HTML-пригодный формат
|
||||
/// </summary>
|
||||
/// <param name="text">Декодированная строка</param>
|
||||
/// <returns>Этот статический метод возвращает шифрованную строку <paramref name="text"/></returns>
|
||||
public static string Base64UrlDecode(string text)
|
||||
{
|
||||
string result = text.Replace('_', '/').Replace('-', '+');
|
||||
switch (result.Length % 4)
|
||||
{
|
||||
case 2:
|
||||
result += "==";
|
||||
break;
|
||||
case 3:
|
||||
result += "=";
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
public static string Base64UrlDecode (string text) => new StringEncryptor().Base64UrlDecode(text);
|
||||
}
|
127
anbs_cp/Classes/Encrypt/StringEncryptor.cs
Normal file
127
anbs_cp/Classes/Encrypt/StringEncryptor.cs
Normal file
@ -0,0 +1,127 @@
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
namespace anbs_cp.Classes.Encrypt;
|
||||
|
||||
/// <summary>
|
||||
/// Класс для шифровки строк
|
||||
/// </summary>
|
||||
public sealed class StringEncryptor: IEncryptor
|
||||
{
|
||||
/// <summary>
|
||||
/// Получение ключа из строки
|
||||
/// </summary>
|
||||
/// <param name="s">Ключ-строка</param>
|
||||
/// <param name="salt">Хэш-ключ</param>
|
||||
/// <returns>Ключ</returns>
|
||||
private static byte[] KeyFromString (string s, byte[] salt)
|
||||
{
|
||||
// Создаю хэшер
|
||||
using Rfc2898DeriveBytes hasher = new(s, salt, 1000, HashAlgorithmName.SHA256);
|
||||
|
||||
// Получаю ключ
|
||||
return hasher.GetBytes(32);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Метод для шифрования строки <paramref name="value"/>
|
||||
/// </summary>
|
||||
/// <param name="value">Строка, которая должна быть зашифрована</param>
|
||||
/// <param name="salt">Ключ</param>
|
||||
/// <returns>Этот метод возвращает зашифрованную строку <paramref name="value"/></returns>
|
||||
public string Encrypt (string value, string salt)
|
||||
{
|
||||
// Создаю криптограф
|
||||
using Aes aes = Aes.Create();
|
||||
|
||||
// Получаю ключ
|
||||
aes.Key = KeyFromString(salt, aes.IV);
|
||||
|
||||
// Открываю поток
|
||||
using MemoryStream ms = new();
|
||||
|
||||
// Пишу данные в поток
|
||||
ms.Write(aes.IV);
|
||||
|
||||
// Создаю шифрованный поток
|
||||
using (CryptoStream cs = new(ms, aes.CreateEncryptor(), CryptoStreamMode.Write, true))
|
||||
// Пишу данные в него
|
||||
cs.Write(Encoding.UTF8.GetBytes(value));
|
||||
|
||||
// Возвращаю зашифрованный текст
|
||||
return Convert.ToBase64String(ms.ToArray());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Метод для дешифрования строки <paramref name="encryptedValue"/>
|
||||
/// </summary>
|
||||
/// <param name="encryptedValue">Строка, которая должна быть дешифрована</param>
|
||||
/// <param name="salt">Ключ</param>
|
||||
/// <returns>Этот метод возвращает дешифрованную строку <paramref name="encryptedValue"/></returns>
|
||||
public string Decrypt (string encryptedValue, string salt)
|
||||
{
|
||||
// Открываю поток в памяти
|
||||
using MemoryStream ms = new(Convert.FromBase64String(encryptedValue));
|
||||
|
||||
// Задаю ключ
|
||||
byte[] iv = new byte[16];
|
||||
|
||||
// Читаю его
|
||||
_ = ms.Read(iv);
|
||||
|
||||
// Создаю криптограф
|
||||
using Aes aes = Aes.Create();
|
||||
|
||||
// Получаю ключ
|
||||
aes.Key = KeyFromString(salt, iv);
|
||||
|
||||
// присваиваю ключ
|
||||
aes.IV = iv;
|
||||
|
||||
// Создаю поток дешифратора
|
||||
using CryptoStream cs = new(ms, aes.CreateDecryptor(), CryptoStreamMode.Read, true);
|
||||
|
||||
// Задаю поток итогового текста
|
||||
using MemoryStream output = new();
|
||||
|
||||
// Копирую данные в выходной поток
|
||||
cs.CopyTo(output);
|
||||
|
||||
// Вывожу расшифрованный текст
|
||||
return Encoding.UTF8.GetString(output.ToArray());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Декодирует зашифрованную строку в HTML-пригодный формат
|
||||
/// </summary>
|
||||
/// <param name="text">Зашифрованная строка</param>
|
||||
/// <returns>Этот метод возвращает дешифрованную строку <paramref name="text"/></returns>
|
||||
public string Base64UrlEncode (string text) => text.TrimEnd('=').Replace('+', '-').Replace('/', '_');
|
||||
|
||||
/// <summary>
|
||||
/// Раскодирует из декодированной строки в HTML-пригодный формат
|
||||
/// </summary>
|
||||
/// <param name="text">Декодированная строка</param>
|
||||
/// <returns>Этот метод возвращает шифрованную строку <paramref name="text"/></returns>
|
||||
public string Base64UrlDecode (string text)
|
||||
{
|
||||
// Первоначальная замена
|
||||
string result = text.Replace('_', '/').Replace('-', '+');
|
||||
|
||||
// Заменяю значения
|
||||
switch (result.Length % 4)
|
||||
{
|
||||
case 2:
|
||||
result += "==";
|
||||
break;
|
||||
case 3:
|
||||
result += "=";
|
||||
break;
|
||||
}
|
||||
|
||||
// Возвращаю результат
|
||||
return result;
|
||||
}
|
||||
}
|
37
anbs_cp/Interfaces/IEncryptor.cs
Normal file
37
anbs_cp/Interfaces/IEncryptor.cs
Normal file
@ -0,0 +1,37 @@
|
||||
namespace anbs_cp.Interfaces;
|
||||
|
||||
/// <summary>
|
||||
/// Интерфейс шифрования
|
||||
/// </summary>
|
||||
public interface IEncryptor
|
||||
{
|
||||
/// <summary>
|
||||
/// Метод для шифрования строки <paramref name="value"/>
|
||||
/// </summary>
|
||||
/// <param name="value">Строка, которая должна быть зашифрована</param>
|
||||
/// <param name="salt">Ключ шифрования</param>
|
||||
/// <returns>Этот метод возвращает зашифрованную строку <paramref name="value"/></returns>
|
||||
string Encrypt (string value, string salt);
|
||||
|
||||
/// <summary>
|
||||
/// Метод для дешифрования строки <paramref name="encryptedValue"/>
|
||||
/// </summary>
|
||||
/// <param name="encryptedValue">Строка, которая должна быть дешифрована</param>
|
||||
/// <param name="salt">Ключ шифрования</param>
|
||||
/// <returns>Этот метод возвращает дешифрованную строку <paramref name="encryptedValue"/></returns>
|
||||
string Decrypt (string encryptedValue, string salt);
|
||||
|
||||
/// <summary>
|
||||
/// Декодирует зашифрованную строку в HTML-пригодный формат
|
||||
/// </summary>
|
||||
/// <param name="text">Зашифрованная строка</param>
|
||||
/// <returns>Этот метод возвращает дешифрованную строку <paramref name="text"/></returns>
|
||||
string Base64UrlEncode (string text);
|
||||
|
||||
/// <summary>
|
||||
/// Раскодирует из декодированной строки в HTML-пригодный формат
|
||||
/// </summary>
|
||||
/// <param name="text">Декодированная строка</param>
|
||||
/// <returns>Этот метод возвращает шифрованную строку <paramref name="text"/></returns>
|
||||
string Base64UrlDecode (string text);
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<Version>2023.902.0</Version>
|
||||
<Version>2023.908.0</Version>
|
||||
<Authors>Александр Бабаев</Authors>
|
||||
<Product>Набор компонентов ANB Software</Product>
|
||||
<Description>Библиотека полезных методов языка C#</Description>
|
||||
@ -38,6 +38,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="gfoidl.Base64" Version="2.0.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="7.0.10" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Shell.Interop" Version="17.7.37355" />
|
||||
<PackageReference Include="MimeTypes" Version="2.4.1">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
|
@ -8,6 +8,7 @@
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=ABCDEFGHJKLMNOPQRSTUVWXYZ/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=anbs/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Darkseal/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Encryptor/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Glendower/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0412_0435_0440_043D_0451_043C/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0412_0438_0434_0435_043E_043A_0430_0440_0442_0430/@EntryIndexedValue">True</s:Boolean>
|
||||
|
Loading…
x
Reference in New Issue
Block a user