2008-11-06 14 views
4

Я использую приведенный ниже код, чтобы сохранить пароль в реестре, как его преобразовать? Код ниже не мой, но он хорошо шифрует.C# Чтение зашифрованных паролей

Благодаря

using System.Security.Cryptography; 

public static string EncodePasswordToBase64(string password) 
{ byte[] bytes = Encoding.Unicode.GetBytes(password); 
    byte[] dst  = new byte[bytes.Length]; 
    byte[] inArray = HashAlgorithm.Create("SHA1").ComputeHash(dst); 
    return Convert.ToBase64String(inArray); 
} 
+3

Я просто хотел удостовериться, что вы знаете, что здесь вы не вводите пароль. – Kevin 2008-11-06 22:45:42

ответ

8

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

2

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

Как сказал кто-то другой, вычислите хэш из пароля пользователя и сравните с сохраненным значением хэша.

31

SHA1 - это алгоритм, не являющийся алгоритмом шифрования, hash. Хэш-алгоритм - это односторонняя функция, которая преобразует данные в хэш этих данных, но исходные данные не могут быть возвращены из хеша. Алгоритм шифрования представляет собой двухстороннюю функцию, которая преобразует данные в зашифрованные данные, а затем зашифрованные данные могут быть преобразованы обратно в исходные данные.

7

У вас нет.

SHA1 - это хэш, а не шифрование. Это односторонняя операция; изменение задний невозможно.

(Хорошо, это не совсем верно, если у вас есть таблица возможных значений SHA1 и простых текстовых значений, таблица радуги, то вы могли бы быть удача)

Кроме того, вы должны быть соления ваш хэши, потому что вы , прямо сейчас, уязвимы для атаки радужного стола. Jeff talks about this немного больше в своем блоге

+1

Он гораздо более уязвим. Любой пароль с одинаковой длиной будет иметь хеш с тем же значением. – Kevin 2008-11-06 21:48:20

3

Хорошо, поэтому я знаю, что это не отвечает на ваш конкретный вопрос Q, но почему вы хотите его вернуть?

Если сравнить, чтобы обеспечить аутентификацию, стандартным подходом является шифрование этого текста ТАКЖЕ и сравнение сохраненного пароля с предоставленным паролем.

Это более безопасно, поскольку это означает, что первоначальный пароль никогда не нуждается в расшифровке.

1

Ум, просто любопытно, но не вернет ли тот же хэш для всех паролей одинаковой длины?

12

Чтобы безопасно хранить пароль, чтобы его можно было прочитать, используйте класс ProtectedData.

public static string ProtectPassword(string password) 
{ 
    byte[] bytes = Encoding.Unicode.GetBytes(password); 
    byte[] protectedPassword = ProtectedData.Protect(bytes, null, DataProtectionScope.CurrentUser); 
    return Convert.ToBase64String(protectedPassword); 
} 

public static string UnprotectPassword(string protectedPassword) 
{ 
    byte[] bytes = Convert.FromBase64String(protectedPassword); 
    byte[] password = ProtectedData.Unprotect(bytes, null, DataProtectionScope.CurrentUser); 
    return Encoding.Unicode.GetString(password); 
} 
+1

Я использую ProtectedData, чтобы я мог шифровать пароли. Я заметил, что если я запустил Protect несколько раз, он будет давать разные строки каждый раз. Расшифровка его дает мне оригинал, но это означает, что для сравнения строк мне приходится расшифровывать и сравнивать результат, а не шифровать то, что они вводят, и сравнивать два зашифрованных результата. Удивительно, как это работает и почему это не дает то же самое каждый раз. – 2013-03-22 00:21:34

0

Используя свой собственный фрагмент кода выше, то, что вы хотите сделать, это вызвать этот метод, когда пользователь сначала выбирает пароль - но добавить к паролю, что называется salt где-то в строке пароля (обычно на начало или конец). Затем, когда пользователь пытается аутентифицироваться позже, они вводят свой пароль, вы запускаете его вместе с хэшем через этот же метод, и если эти два хэша равны, это статистически отличный шанс, что пароли равны и действительны.

Говорят, что SHA1, как известно, имеет слабые места, и вы должны выбрать более сильный алгоритм. Если вы хотите остаться в семье SHA, SHA512 довольно хорош.

0

Вы хотите использовать шифрование, а не хеширование. SHA отлично, но для этого используются методы шифрования. Проблема с шифрованием всегда там, где класть ключ для него. Вы не упомянули, была ли это рабочая станция или сервер, на котором вы это делали. На сервере мне лучше просто использовать ACL для ограничения доступа к ключу reg. Администраторы обычно могут получить доступ к ключу шифрования в любом случае ... у вас должно быть какое-то доверие. На рабочей станции вы можете использовать шифрование и хранить ключ в коде или использовать сертификат и ограничивать доступ к нему, по крайней мере, в корпоративной среде ... не для программного обеспечения для продажи).

Вы можете использовать класс ProtectedData, но имейте в виду, что он использует профили пользователей для его использования ключа, и поэтому вы должны убедиться, что вы выдаете себя за пользователя, у которого есть профиль, с помощью ключа, который вам нужен. Это может быть или не быть тривиальным и может или не может вызывать головные боли и проблемы с безопасностью.

2

Чтобы использовать класс System.Security.Cryptography.ProtectedData, вы должны добавить ссылку на System.Security в свой проект.

(правая кнопка мыши по папке References выберите «Add Reference ...», найти System.Security на вкладке .NET)

0

Я заметил, что недавнее добавление класса XMLEncryptedData. Для шифрования данных в XML-файл метод XMLEncryptedData более желателен, чем метод DPAPI?

Смежные вопросы