Задать вопрос

Как реализовать сохранение пароля в приложении на C#?

Есть приложение, которое использует авторизацию, и я хочу сделать возможность сохранения логина и пароля (при желании пользователя), есть ои какие то средства для реализации этого? Или как можно сделать это иначе
  • Вопрос задан
  • 17758 просмотров
Подписаться 5 Оценить Комментировать
Решения вопроса 1
Webdesus
@Webdesus
Если приложение локальное то нужно сделать шифрование таким чтобы зная алгоритм шифрование его не возможно было бы расшифровать. Потому что продвинутый пользователь сможет декомпилировать ваш код и посмотреть что за алгоритм Вы используете.

Безопаснее использовать какой ни будь сервис авторизации. Это то что касаемо корпоративных приложений. Ту же windows авторизацию в домене.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Zerpico
@Zerpico
Я пользуюсь SHA1, не самый безопасный конечно но у меня тут и не ФСБ всё таки.
вот 2 метода для шифровки и дешифровки:
//шифрование
public static string Encrypt(string plainText, string password,
       string salt = "Kosher", string hashAlgorithm = "SHA1",
       int passwordIterations = 2, string initialVector = "OFRna73m*aze01xY",
       int keySize = 256)
{
    if (string.IsNullOrEmpty(plainText))
		return "";
 
    byte[] initialVectorBytes = Encoding.ASCII.GetBytes(initialVector);
    byte[] saltValueBytes = Encoding.ASCII.GetBytes(salt);
    byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
 
    PasswordDeriveBytes derivedPassword = new PasswordDeriveBytes(password, saltValueBytes, hashAlgorithm, passwordIterations);
    byte[] keyBytes = derivedPassword.GetBytes(keySize / 8);
    RijndaelManaged symmetricKey = new RijndaelManaged();
    symmetricKey.Mode = CipherMode.CBC;
 
    byte[] cipherTextBytes = null;
 
    using (ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initialVectorBytes))
    {
        using (MemoryStream memStream = new MemoryStream())
        {
            using (CryptoStream cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write))
            {
                cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                cryptoStream.FlushFinalBlock();
                cipherTextBytes = memStream.ToArray();
                memStream.Close();
                cryptoStream.Close();
            }
        }
    }
 
     symmetricKey.Clear();
       return Convert.ToBase64String(cipherTextBytes);
}
 
 
 
//дешифрование
public static string Decrypt(string cipherText, string password,
       string salt = "Kosher", string hashAlgorithm = "SHA1",
       int passwordIterations = 2, string initialVector = "OFRna73m*aze01xY",
       int keySize = 256)
{         
    if (string.IsNullOrEmpty(cipherText))
        return "";
 
    byte[] initialVectorBytes = Encoding.ASCII.GetBytes(initialVector);
    byte[] saltValueBytes = Encoding.ASCII.GetBytes(salt);
    byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
 
    PasswordDeriveBytes derivedPassword = new PasswordDeriveBytes(password, saltValueBytes, hashAlgorithm, passwordIterations);
    byte[] keyBytes = derivedPassword.GetBytes(keySize / 8);
 
    RijndaelManaged symmetricKey = new RijndaelManaged();
    symmetricKey.Mode = CipherMode.CBC;
 
    byte[] plainTextBytes = new byte[cipherTextBytes.Length];
    int byteCount = 0;
 
    using (ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initialVectorBytes))
    {
        using (MemoryStream memStream = new MemoryStream(cipherTextBytes))
        {
           using (CryptoStream cryptoStream = new CryptoStream(memStream, decryptor, CryptoStreamMode.Read))
           {
               byteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
               memStream.Close();
               cryptoStream.Close();
           }
        }
    }
 
    symmetricKey.Clear();
    return Encoding.UTF8.GetString(plainTextBytes, 0, byteCount);
}


Ну пользоваться просто:
Encrypt(text, password); //где text — текст который необходимо зашифровать,password — пароль для шифровки
Decrypt(text, password); //аналогично
 
. . .
// UPD1: можно воспользоваться и более сложной схемой включая размер ключа и байт
Encrypt(text, password1, password2, «SHA1», 2,«16CHARSLONG12345», 256);
Decrypt(text, password1, password2, «SHA1», 2,«16CHARSLONG12345», 256);
Ответ написан
ScorpLeX
@ScorpLeX
Можно просто зашифровать и положить в файл, как вариант можно хранить сессию (куки) пользователя если авторизация на сайте например.
В любом случае лучше дополнительно зашифровать и еще раз зашифровать.
Ответ написан
digitallez
@digitallez
Хреновааа
Шифровать логин/пароль можно используя DPAPI (на харбе по этой теме есть статья и вопрос).
Ответ написан
Комментировать
@pantoriy
Ну тут надо шифровка типа хэш, а не синхронное. А то можно взломать! Это не пойдёт сразу... нужна функция получения хэша по алгоритму скажем MD5. Хотя желательно найти получше. Есть такие... ну а дальше всё просто пароль сразу же после ввода переводите в хэш и в этом виде и храните. Для проверки сравниваете хэши... Никто нигде никакие пароль не хранит, только хэши. Которые придуманы так чтобы нельзя было по ним восстановить пароль... Это самый безопасный способ. Если конечно не взломать сам алгоритм хэширования. MD5 взламывается. Уже были прецеденты. так что если вам нужна высокая защита, то надо брать другой более надёжный алгоритм.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы