PasswordDeriveBytes. Где хранить пароль и соль ключа? - C#

Узнай цену своей работы

Формулировка задачи:

Из справки по данному класу: Примечание о безопасности Примечание по безопасности Не следует жестко кодировать пароль в исходный код. Жестко запрограммированные пароли можно извлечь из сборки с помощью Ildasm.exe (дизассемблер IL) средства, или шестнадцатеричного редактора, либо открыв сборку в текстовом редакторе, например notepad.exe. Подскажите как лучше реализовать хранение пароля и соли ключа. В защите информации я не силен.

Решение задачи: «PasswordDeriveBytes. Где хранить пароль и соль ключа?»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Security.Cryptography;
  6. using System.IO;
  7.  
  8. namespace Shifr
  9. {
  10.     class Program
  11.     {
  12.         //метод шифрования строки
  13.         public static string Shifrovka(string ishText, string pass,
  14.                string sol = "doberman", string cryptographicAlgorithm = "SHA1",
  15.                int passIter = 2, string initVec = "a8doSuDitOz1hZe#",
  16.                int keySize = 256)
  17.         {
  18.             if (string.IsNullOrEmpty(ishText))
  19.                 return "";
  20.  
  21.             byte[] initVecB = Encoding.ASCII.GetBytes(initVec);
  22.             byte[] solB = Encoding.ASCII.GetBytes(sol);
  23.             byte[] ishTextB = Encoding.UTF8.GetBytes(ishText);
  24.  
  25.             PasswordDeriveBytes derivPass = new PasswordDeriveBytes(pass, solB, cryptographicAlgorithm, passIter);
  26.             byte[] keyBytes = derivPass.GetBytes(keySize / 8);
  27.             RijndaelManaged symmK = new RijndaelManaged();
  28.             symmK.Mode = CipherMode.CBC;
  29.  
  30.             byte[] cipherTextBytes = null;
  31.  
  32.             using (ICryptoTransform encryptor = symmK.CreateEncryptor(keyBytes, initVecB))
  33.             {
  34.                 using (MemoryStream memStream = new MemoryStream())
  35.                 {
  36.                     using (CryptoStream cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write))
  37.                     {
  38.                         cryptoStream.Write(ishTextB, 0, ishTextB.Length);
  39.                         cryptoStream.FlushFinalBlock();
  40.                         cipherTextBytes = memStream.ToArray();
  41.                         memStream.Close();
  42.                         cryptoStream.Close();
  43.                     }
  44.                 }
  45.             }
  46.  
  47.             symmK.Clear();
  48.             return Convert.ToBase64String(cipherTextBytes);
  49.         }
  50.  
  51.         //метод дешифрования строки
  52.         public static string DeShifrovka(string ciphText, string pass,
  53.                string sol = "doberman", string cryptographicAlgorithm = "SHA1",
  54.                int passIter = 2, string initVec = "a8doSuDitOz1hZe#",
  55.                int keySize = 256)
  56.         {
  57.             if (string.IsNullOrEmpty(ciphText))
  58.                 return "";
  59.  
  60.             byte[] initVecB = Encoding.ASCII.GetBytes(initVec);
  61.             byte[] solB = Encoding.ASCII.GetBytes(sol);
  62.             byte[] cipherTextBytes = Convert.FromBase64String(ciphText);
  63.  
  64.             PasswordDeriveBytes derivPass = new PasswordDeriveBytes(pass, solB, cryptographicAlgorithm, passIter);
  65.             byte[] keyBytes = derivPass.GetBytes(keySize / 8);
  66.  
  67.             RijndaelManaged symmK = new RijndaelManaged();
  68.             symmK.Mode = CipherMode.CBC;
  69.  
  70.             byte[] plainTextBytes = new byte[cipherTextBytes.Length];
  71.             int byteCount = 0;
  72.  
  73.             using (ICryptoTransform decryptor = symmK.CreateDecryptor(keyBytes, initVecB))
  74.             {
  75.                 using (MemoryStream mSt = new MemoryStream(cipherTextBytes))
  76.                 {
  77.                     using (CryptoStream cryptoStream = new CryptoStream(mSt, decryptor, CryptoStreamMode.Read))
  78.                     {
  79.                         byteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
  80.                         mSt.Close();
  81.                         cryptoStream.Close();
  82.                     }
  83.                 }
  84.             }
  85.  
  86.             symmK.Clear();
  87.             return Encoding.UTF8.GetString(plainTextBytes, 0, byteCount);
  88.         }
  89.  
  90.         static void Main(string[] args)
  91.         {
  92.  
  93.             String gg = Shifrovka("Маша, я тебя люблю!", "пароль");
  94.             String gg2 = DeShifrovka(gg, "пароль");
  95.             Console.WriteLine(gg);
  96.             Console.WriteLine(gg2);
  97.             Console.ReadKey();
  98.  
  99.         }
  100.     }
  101. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы