Как проще всего зашифровать пароль при сохранении его в реестре?

В настоящее время я пишу его открытым текстом 9X_encryption упс!, это собственная программа, так что это 9X_encrypt не так уж плохо, но я хотел бы сделать это 9X_c#-language правильно. Как мне зашифровать это при записи 9X_c#-language в реестр и как расшифровать?

OurKey.SetValue("Password", textBoxPassword.Text);

63
1

  • Есть ответ на связанный вопрос - [Простое ...
11
Общее количество ответов: 11

Ответ #1

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

Вы не расшифровываете пароли аутентификации!

Хешируйте их, используя что-то вроде поставщика 9X_c-sharp SHA256, а когда вам нужно оспорить, хешируйте 9X_encryption ввод от пользователя и посмотрите, совпадают 9X_encrypt ли два хеша.

byte[] data = System.Text.Encoding.ASCII.GetBytes(inputString);
data = new System.Security.Cryptography.SHA256Managed().ComputeHash(data);
String hash = System.Text.Encoding.ASCII.GetString(data);

Оставить пароли двусторонними 9X_c# - это действительно ужасная модель.

Edit2: Я думал, мы 9X_c-sharp только что говорили об аутентификации на 9X_c#-language линии фронта. Конечно, есть случаи, когда 9X_decrypt вы хотите зашифровать пароли для других 9X_encrypt вещей, которые должны быть обратимыми, но 9X_c#.net поверх всего этого должна быть односторонняя 9X_c#.net блокировка (за очень немногими исключениями).

Я 9X_password обновил алгоритм хеширования, но для максимальной 9X_data-encryption эффективности вы хотите сохранить a private salt and add that to your input before hashing it. Вы бы 9X_c#-language сделали это снова, когда сравните. Это добавляет 9X_data-encryption еще один слой, который еще больше усложняет 9X_c#-language обратное движение.

137
9

  • ** Пожалуйста, не рекомендуйте MD5. ** [MD5 небезопасен для защиты паролей.] (Http://codahale.com/how-to-safely-store-a-password/) [MD5 поможет вам и вашим компания в новостях по неправильным причинам.] (http://www.h-online.com/secu ...

Ответ #2

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

Также подумайте о том, чтобы "засолить" свой 9X_c#.net хеш (это не кулинарная концепция!). По сути, это 9X_c#-language означает добавление случайного текста к 9X_c#-language паролю перед его хешированием.

"The salt value helps to slow an attacker perform a dictionary attack should your credential store be compromised, giving you additional time to detect and react to the compromise."

Для 9X_visual-c# хранения хэшей паролей:

а) Создайте случайное 9X_encrypted значение соли:

byte[] salt = new byte[32];
System.Security.Cryptography.RNGCryptoServiceProvider.Create().GetBytes(salt);

б) Добавьте соль к паролю.

// Convert the plain string pwd into bytes
byte[] plainTextBytes = System.Text UnicodeEncoding.Unicode.GetBytes(plainText);
// Append salt to pwd before hashing
byte[] combinedBytes = new byte[plainTextBytes.Length + salt.Length];
System.Buffer.BlockCopy(plainTextBytes, 0, combinedBytes, 0, plainTextBytes.Length);
System.Buffer.BlockCopy(salt, 0, combinedBytes, plainTextBytes.Length, salt.Length);

в) Хешируйте 9X_password комбинированный пароль и соль:

// Create hash for the pwd+salt
System.Security.Cryptography.HashAlgorithm hashAlgo = new System.Security.Cryptography.SHA256Managed();
byte[] hash = hashAlgo.ComputeHash(combinedBytes);

г) Добавьте 9X_c# соль к полученному хешу.

// Append the salt to the hash
byte[] hashPlusSalt = new byte[hash.Length + salt.Length];
System.Buffer.BlockCopy(hash, 0, hashPlusSalt, 0, hash.Length);
System.Buffer.BlockCopy(salt, 0, hashPlusSalt, hash.Length, salt.Length);

д) Сохраните результат 9X_c#.net в базе данных пользовательского магазина.

Этот 9X_c#.net подход означает, что вам не нужно хранить 9X_passwords соль отдельно, а затем повторно вычислять 9X_cipher хэш, используя значение соли и значение 9X_decryption пароля в виде открытого текста, полученное 9X_deciphering от пользователя.

Изменить. По мере того, как необработанные 9X_encryption вычислительные мощности становятся дешевле 9X_c#-language и быстрее, ценность хеширования - или хеширования 9X_encryption солей - снижается. Jeff Atwood has an excellent 2012 update слишком длинный, чтобы 9X_csharp повторять здесь полностью, в котором говорится:

Это 9X_encrypted (с использованием соленых хэшей) создаст 9X_c#-language иллюзию безопасности больше, чем любая реальная 9X_passwords безопасность. Поскольку вам нужны как соль, так 9X_encrypt и выбор алгоритма хеширования для генерации 9X_c#-language хеша и для проверки хеша, маловероятно, что 9X_encryption у злоумышленника будет один, но не другой. Если 9X_deciphering вы были скомпрометированы до такой степени, что 9X_passwords у злоумышленника есть ваша база данных паролей, разумно 9X_decryption предположить, что они либо имеют, либо могут 9X_encryption получить вашу секретную, скрытую соль.

Первое 9X_deciphering правило безопасности - всегда предполагать 9X_passwords и планировать худшее. Следует ли использовать 9X_csharp соль, в идеале случайную соль для каждого 9X_encrypted пользователя? Конечно это определенно 9X_c#.net хорошая практика, и, по крайней мере, она 9X_c-sharp позволяет вам устранение неоднозначности 9X_csharp двух пользователей с одинаковым паролем. Но 9X_password в наши дни одни только соли уже не могут 9X_decrypt спасти вас от человека, готового потратить несколько 9X_encrypt тысяч долларов на оборудование видеокарты, и 9X_c-sharp если вы думаете, что они может, у тебя 9X_encryption проблемы.

26
2

  • Он хранил это открытым текстом, а вас беспокоит ...

Ответ #3

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

Том Скотт правильно описал, как (не) хранить 9X_c-sharp пароли, на Computerphile.

https://www.youtube.com/watch?v=8ZtInClXe1Q

  1. Если вы вообще можете этого избежать, не пытайтесь хранить пароли самостоятельно. Вместо этого используйте 9X_decrypt отдельную, предварительно установленную 9X_c#.net и надежную платформу аутентификации пользователей 9X_c-sharp (например, поставщиков OAuth, домен Active 9X_encryption Directory вашей компании и т. д.).

  2. Если вам необходимо хранить пароли, не следуйте приведенным здесь инструкциям. По крайней 9X_data-encryption мере, не без ознакомления с более свежими 9X_passwords и авторитетными публикациями, применимыми 9X_encrypt к выбранному вами языку.

Здесь, безусловно, много 9X_data-encryption умных людей, и, возможно, даже есть хорошие 9X_cipher рекомендации. Но велика вероятность, что 9X_decrypt к тому времени, когда вы это прочитаете, все 9X_decrypt ответы здесь (включая этот) уже устарели.


Правильный способ хранения паролей со временем меняется.

Вероятно, чаще, чем некоторые люди меняют нижнее белье.


Все, что 9X_deciphering было сказано, вот некоторые общие рекомендации, которые, надеюсь, останутся 9X_password полезными в течение некоторого времени.

  1. Не шифруйте пароли. Любой метод хранения, который позволяет восстановить сохраненные данные, по своей сути небезопасен для хранения паролей — включая все формы шифрования.
  2. Обрабатывайте пароли точно так, как они были введены пользователем в процессе создания. Все, что 9X_deciphering вы делаете с паролем перед его отправкой 9X_c-sharp в ​​криптографический модуль, скорее всего, только 9X_password ослабит его. Выполнение любого из следующих 9X_encrypt действий также только усложняет процесс 9X_c# хранения и проверки паролей, что может вызвать 9X_visual-c# другие проблемы (возможно, даже создать 9X_password уязвимости) в будущем.

    • Не преобразовывать в верхний/нижний регистр.
    • Не удаляйте пробелы.
    • Не удаляйте недопустимые символы или строки.
    • Не меняйте кодировку текста.
    • Не делайте замены символов или строк.
    • Не усекайте пароли любой длины.
  3. Отказ от создания любых паролей, которые нельзя сохранить без изменения. Усиление вышеизложенного. Если 9X_password по какой-то причине ваш механизм хранения 9X_data-encryption паролей не может должным образом обрабатывать 9X_visual-c# определенные символы, пробелы, строки или 9X_c#-language длину пароля, верните ошибку и сообщите 9X_decrypt пользователю об ограничениях системы, чтобы 9X_c-sharp он мог повторить попытку с паролем, который 9X_.cs-file им подходит. Для лучшего взаимодействия 9X_encryption с пользователем заранее сделайте список 9X_deciphering этих ограничений доступным для пользователя. Даже 9X_decrypt не беспокойтесь, не говоря уже о том, чтобы 9X_encrypt скрыть список от злоумышленников — они и 9X_c# так достаточно легко разберутся сами.

  4. Используйте длинную, случайную и уникальную соль для каждой учетной записи. Пароли двух учетных записей никогда не должны выглядеть одинаково в хранилище, даже если пароли на самом деле идентичны.
  5. Используйте медленные и криптографически стойкие алгоритмы хеширования, предназначенные для использования с паролями. MD5 определенно не подходит. SHA-1/SHA-2 запрещены. Но я также не собираюсь говорить вам, что вы должны использовать здесь. (См. первый пункт №2 в этом посте.)
  6. Повторяйте столько, сколько сможете вытерпеть. Хотя у вашей системы могут быть более полезные дела, связанные с циклами процессора, чем хеширование паролей в течение всего дня, у людей, которые будут взламывать ваши пароли, есть системы, которые этого не делают. Сделайте это как можно более жестким для них, но не слишком «жестким» для себя.

Самое 9X_c-sharp главное...

Не слушайте никого здесь.

Найдите авторитетную и самую последнюю 9X_.cs-file публикацию о правильных методах хранения 9X_encryption паролей для выбранного вами языка. На самом 9X_data-encryption деле, вы должны найти несколько недавних 9X_c-sharp публикаций из нескольких разных источников, которые 9X_decryption совпадают, прежде чем остановиться на одном 9X_c-sharp методе.

Крайне возможно, что все, что все 9X_decryption здесь (включая меня) сказали, уже было заменено 9X_cipher лучшими технологиями или сделано небезопасным 9X_visual-c# из-за недавно разработанных методов атаки. Иди 9X_deciphering и найди что-нибудь, чего, скорее всего, нет.

15
1

  • Хороший ответ, но «Самое главное ... Не слушай никого здесь. Иди поищи авторитетного ...» - эээ, разве ты не принимаешь, для чего создан этот сайт? Сколько книг (возможно) купит и прочи ...

Ответ #4

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

Вот что вы хотели бы сделать:

OurKey.SetValue("Password", StringEncryptor.EncryptString(textBoxPassword.Text));
OurKey.GetValue("Password", StringEncryptor.DecryptString(textBoxPassword.Text));

Вы можете сделать 9X_password это с помощью следующих классов. Этот класс 9X_password является универсальным классом и является 9X_encrypted конечной точкой клиента. Он включает IOC 9X_c# различных алгоритмов шифрования с использованием 9X_decrypt Ninject.

public class StringEncryptor
{
    private static IKernel _kernel;

    static StringEncryptor()
    {
        _kernel = new StandardKernel(new EncryptionModule());
    }

    public static string EncryptString(string plainText)
    {
        return _kernel.Get().EncryptString(plainText);
    }

    public static string DecryptString(string encryptedText)
    {
        return _kernel.Get().DecryptString(encryptedText);
    }
}

Следующий класс - это класс ninject, который 9X_c#-language позволяет вводить различные алгоритмы:

public class EncryptionModule : StandardModule
{
    public override void Load()
    {
        Bind().To();
    }
}

Это 9X_c#-language интерфейс, который должен реализовать любой 9X_.cs-file алгоритм для шифрования / дешифрования строк:

public interface IStringEncryptor
{
    string EncryptString(string plainText);
    string DecryptString(string encryptedText);
}

Это 9X_c# реализация с использованием алгоритма TripleDES:

public class TripleDESStringEncryptor : IStringEncryptor
{
    private byte[] _key;
    private byte[] _iv;
    private TripleDESCryptoServiceProvider _provider;

    public TripleDESStringEncryptor()
    {
        _key = System.Text.ASCIIEncoding.ASCII.GetBytes("GSYAHAGCBDUUADIADKOPAAAW");
        _iv = System.Text.ASCIIEncoding.ASCII.GetBytes("USAZBGAW");
        _provider = new TripleDESCryptoServiceProvider();
    }

    #region IStringEncryptor Members

    public string EncryptString(string plainText)
    {
        return Transform(plainText, _provider.CreateEncryptor(_key, _iv));
    }

    public string DecryptString(string encryptedText)
    {
        return Transform(encryptedText, _provider.CreateDecryptor(_key, _iv));
    }

    #endregion

    private string Transform(string text, ICryptoTransform transform)
    {
        if (text == null)
        {
            return null;
        }
        using (MemoryStream stream = new MemoryStream())
        {
            using (CryptoStream cryptoStream = new CryptoStream(stream, transform, CryptoStreamMode.Write))
            {
                byte[] input = Encoding.Default.GetBytes(text);
                cryptoStream.Write(input, 0, input.Length);
                cryptoStream.FlushFinalBlock();

                return Encoding.Default.GetString(stream.ToArray());
            }
        }
    }
}

Вы 9X_visual-c# можете посмотреть мое видео и скачать код 9X_.cs-file для этого по адресу: http://www.wrightin.gs/2008/11/how-to-encryptdecrypt-sensitive-column-contents-in-nhibernateactive-record-video.html

12
1

  • @pst Он демонстрирует, как сделать вашу реализацию подключаемой с помощью любого метода шифрования, вместо того, чтобы рекомендовать какой-либо конкретный мето ...

Ответ #5

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

Один из вариантов - сохранить хэш (SHA1, MD5) пароля 9X_decryption вместо пароля в виде открытого текста, и 9X_encrypted всякий раз, когда вы хотите узнать, правильный 9X_c#.net ли пароль, просто сравните его с этим хешем.

Если 9X_visual-c# вам нужно безопасное хранилище (например, для 9X_passwords пароля, который вы будете использовать для 9X_passwords подключения к службе), проблема будет сложнее.

Если 9X_c-sharp это просто для аутентификации, то достаточно 9X_c# использовать хеш.

10
2

  • SHA1 / MD5 для паролей? Нет, черт возьми, нет.<p> ...

Ответ #6

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

Если вы хотите иметь возможность расшифровать 9X_passwords пароль, я думаю, что самым простым способом 9X_csharp было бы использовать DPAPI (режим пользовательского 9X_password хранилища) для шифрования / дешифрования. Таким 9X_csharp образом, вам не придется возиться с ключами 9X_csharp шифрования, хранить их где-то или жестко 9X_deciphering закодировать их в своем коде - в обоих случаях 9X_c-sharp кто-то может обнаружить их, просмотрев реестр, пользовательские 9X_encryption настройки или используя Reflector.

В противном 9X_c# случае используйте хеши SHA1 или MD5, как 9X_visual-c# говорили здесь другие.

9
1

  • SHA1 и MD5 * не * ...

Ответ #7

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

Как сказал ligget78, DPAPI может быть хорошим 9X_decrypt способом хранения паролей. Check out the ProtectedData class on MSDN например использование.

6
0

Ответ #8

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

Я просмотрел все наглядные примеры процесса 9X_decryption шифрования и дешифрования, но большинство 9X_csharp из них были слишком сложными.

В любом случае 9X_data-encryption есть много причин, по которым кто-то может 9X_data-encryption захотеть расшифровать некоторые текстовые 9X_data-encryption значения, включая пароли. Причина, по которой 9X_decrypt мне нужно расшифровать пароль на сайте, над 9X_data-encryption которым я работаю в настоящее время, заключается 9X_encrypt в том, что они хотят быть уверены, что когда 9X_password кто-то будет вынужден изменить свой пароль 9X_password по истечении срока его действия, мы не позволим 9X_c#.net им изменить его с помощью близкого варианта 9X_decrypt того же пароля. они использовали за последние 9X_visual-c# x месяцев.

Итак, я написал процесс, который 9X_c#.net будет делать это в упрощенной форме. Надеюсь, этот 9X_data-encryption код кому-то будет полезен. Насколько я знаю, я 9X_encryption могу использовать это в другое время для 9X_encryption другой компании / сайта.

public string GenerateAPassKey(string passphrase)
    {
        // Pass Phrase can be any string
        string passPhrase = passphrase;
        // Salt Value can be any string(for simplicity use the same value as used for the pass phrase)
        string saltValue = passphrase;
        // Hash Algorithm can be "SHA1 or MD5"
        string hashAlgorithm = "SHA1";
        // Password Iterations can be any number
        int passwordIterations = 2;
        // Key Size can be 128,192 or 256
        int keySize = 256;
        // Convert Salt passphrase string to a Byte Array
        byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
        // Using System.Security.Cryptography.PasswordDeriveBytes to create the Key
        PasswordDeriveBytes pdb = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);
        //When creating a Key Byte array from the base64 string the Key must have 32 dimensions.
        byte[] Key = pdb.GetBytes(keySize / 11);
        String KeyString = Convert.ToBase64String(Key);

        return KeyString;
    }

 //Save the keystring some place like your database and use it to decrypt and encrypt
//any text string or text file etc. Make sure you dont lose it though.

 private static string Encrypt(string plainStr, string KeyString)        
    {            
        RijndaelManaged aesEncryption = new RijndaelManaged();
        aesEncryption.KeySize = 256;
        aesEncryption.BlockSize = 128;
        aesEncryption.Mode = CipherMode.ECB;
        aesEncryption.Padding = PaddingMode.ISO10126;
        byte[] KeyInBytes = Encoding.UTF8.GetBytes(KeyString);
        aesEncryption.Key = KeyInBytes;
        byte[] plainText = ASCIIEncoding.UTF8.GetBytes(plainStr);
        ICryptoTransform crypto = aesEncryption.CreateEncryptor();
        byte[] cipherText = crypto.TransformFinalBlock(plainText, 0, plainText.Length);
        return Convert.ToBase64String(cipherText);
    }

 private static string Decrypt(string encryptedText, string KeyString) 
    {
        RijndaelManaged aesEncryption = new RijndaelManaged(); 
        aesEncryption.KeySize = 256;
        aesEncryption.BlockSize = 128; 
        aesEncryption.Mode = CipherMode.ECB;
        aesEncryption.Padding = PaddingMode.ISO10126;
        byte[] KeyInBytes = Encoding.UTF8.GetBytes(KeyString);
        aesEncryption.Key = KeyInBytes;
        ICryptoTransform decrypto = aesEncryption.CreateDecryptor(); 
        byte[] encryptedBytes = Convert.FromBase64CharArray(encryptedText.ToCharArray(), 0, encryptedText.Length); 
        return ASCIIEncoding.UTF8.GetString(decrypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length)); 
    }

 String KeyString = GenerateAPassKey("PassKey");
 String EncryptedPassword = Encrypt("25Characterlengthpassword!", KeyString);
 String DecryptedPassword = Decrypt(EncryptedPassword, KeyString);

6
0

Ответ #9

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

Если это пароль, используемый для аутентификации 9X_data-encryption в вашем приложении, хешируйте пароль, как 9X_visual-c# предлагают другие.

Если вы храните пароли 9X_csharp для внешнего ресурса, вам часто нужно иметь 9X_c#-language возможность запрашивать у пользователя эти 9X_csharp учетные данные и давать ему возможность 9X_encrypted безопасно сохранить их. Windows предоставляет 9X_deciphering для этой цели пользовательский интерфейс 9X_c#.net учетных данных (CredUI) - существует ряд 9X_encryption примеров, показывающих, как использовать 9X_cipher это в .NET, включая this one on MSDN.

5
0

Ответ #10

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

..NET предоставляет службы криптографии 9X_encrypt в классе, содержащемся в System.Security.Cryptography 9X_csharp пространство имен.

1
1

  • Этот ответ настолько широк, что бесполезен. Выбор правильной криптовалюты и ее правильна ...

Ответ #11

Ответ на вопрос: Как проще всего зашифровать пароль при сохранении его в реестре?

Если вам нужно нечто большее, например, защита 9X_deciphering строки подключения (для подключения к базе 9X_c#.net данных), отметьте этот article, так как он предоставляет 9X_decrypt лучший «вариант» для этого.

Ответ Оли тоже 9X_encrypt хорош, поскольку он показывает, как можно 9X_decryption создать хеш для строки.

1
0