Как зашифровать пароль?(csharp / dotnet - база данных Azure SQL) - PullRequest
0 голосов
/ 26 февраля 2019

Я работаю над своим первым проектом базы данных SQL Azure в csharp, где код выглядит в основном как примеры кодов в их документации:

https://docs.microsoft.com/en-us/azure/mysql/connect-csharp

Я сейчас хранюмое имя пользователя и пароль в файле конфигурации JSON, просто в текстовом виде.Я хотел бы иметь возможность зашифровать их, но не уверен в том, как спроектировать / реализовать это.

В идеале, пользователь сможет выполнить одноразовую конфигурацию (example.exe --config -username {username} -password {password}), программа хеширует пароль и сохраняет его в моем config.json, и может расшифровать его, когда пользователь хочет использовать программу для взаимодействия со своей базой данных.

Имеет ли это смысл / безопасно с точки зрения дизайна?Какая структура шифрования / дешифрования будет рекомендована для этого использования?Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Однажды я работал над проектом, в котором я сделал что-то подобное.Здесь DecryptString выдаст исключение, если присутствует оригинальная строка.Вы также можете использовать флаг в DecryptString, чтобы указать, если расшифровка прошла успешно.

    #region Properties
    public string EmailAddress { get; set; }
    public string Password { get; set; }
    #endregion

    public void Initialize()
    {
        try
        {
            // Decrypt username & password
            // this will throw an error if original string is present
            EmailAddress = DecryptString(EmailAddress);
            Password = DecryptString(Password);
        }
        catch (Exception)
        {
            EncryptAppConfig(EmailAddress, Password);
            _log.Info("Encrypted Config file with email and password. ");
        }
    }

Тогда ваши методы EncryptAppConfig и DecryptAppConfig могут использовать методы и свойства из System.Security.Cryptography, такие как RijndaelManaged, Rfc2898DeriveBytes.

0 голосов
/ 26 февраля 2019

Для этой цели вы можете использовать класс System.Security.CryptoGraphy.ProtectedData , т. Е. Шифровать, затем хранить зашифрованные учетные данные пользователя и расшифровывать при необходимости.Вы можете прочитать об этом здесь:

https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection

https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.protecteddata?view=netframework-4.7.2

Вот пример:

using System;
using System.Text;
// Reference assembly 'System.Security'
using System.Security.Cryptography;

namespace TestProtectedData
{
    class Program
    {
        // Encrypt plainText and return a base-64 encoded cipher text
        static string Encrypt(string plainText)
        {
            byte[] plainBytes = UnicodeEncoding.UTF8.GetBytes(plainText);
            byte[] cipherBytes = ProtectedData.Protect(plainBytes, null, DataProtectionScope.CurrentUser);
            return Convert.ToBase64String(cipherBytes);
        }

        // Decrypt a base-64 encoded cipher text and return plain text
        static string Decrypt(string cipherBase64)
        {
            var cipherBytes = Convert.FromBase64String(cipherBase64);
            var plainBytes = ProtectedData.Unprotect(cipherBytes, null, DataProtectionScope.CurrentUser);
            return Encoding.UTF8.GetString(plainBytes, 0, plainBytes.Length);
        }

        static void Main(string[] args)
        {
            // plainTextToEncrypt can be a connection string, user credentials or similar
            var plainTextToEncrypt = "Hello, secret!";
            Console.WriteLine("Plain text: " + plainTextToEncrypt);
            // Getting a base64 encoded string as the encryption result for easy storage
            var cipherBase64 = Encrypt(plainTextToEncrypt);
            // Save the cipherBase64 string into a configuration file or similar
            Console.WriteLine("Encrypted text (base64): " + cipherBase64);
            // When needed, read the cipherBase64 string and decrypt the text
            var plainTextDecrypted = Decrypt(cipherBase64);
            Console.WriteLine("Decrypted text: " + plainTextDecrypted);
            Console.ReadKey();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...