Рейтинг:
0
OriginalGriff
Вы не можете: хэши не являются алгоритмами шифрования, и вся идея заключается в том, что они не могут быть обращены, чтобы получить исходный ввод - вот почему они используются для хранения паролей вместо функций шифрования.
Если вы хотите хранить зашифрованные данные, вам необходимо использовать функцию шифрования, такую как Triple DES или аналогичную: Класс TripleDES (Система.Безопасность.Криптография)[^]
Kenneth Haugland
- вот почему они используются для хранения паролей, а не для функций шифрования. - значит, существует более 1 правильного пароля?
lukeer
Объявление, насколько я понимаю, да. Существует неограниченное количество паролей, которые все дают один и тот же хэш и поэтому принимаются функцией проверки паролей.
Поиск такого пароля, который соответствует хэшу, называется "столкновением".
Но эти пароли невозможно угадать, глядя на хэш. Вы должны попробовать их все. И есть гораздо больше возможностей, которые не совпадают, чем те, которые совпадают.
OriginalGriff
Да, в теории. Но...не все из них являются просто допустимыми символами, которые могут быть "типизированы" - хэш-входы принимают байтовые значения неопределенной длины, поэтому количество потенциальных входов, которые вы должны попытаться получить "надежное" столкновение, намного, намного выше, чем шансы решить его с помощью атаки "грубой силы" против чисто строкового входа.
И вы не можете "работать назад" от хэш-значения и гарантировать, что получите ввод, который вы можете ввести в любой форме или форме! Вы получите допустимое значение, но оно в значительной степени бесполезно (особенно если входные данные также "соленые" - даже если вы можете ввести его, он не будет соответствовать никакому другому пользовательскому хэшу, так что это тот же самый процесс снова и снова для следующего пользователя).
Kenneth Haugland
Я читал, что если вы храните пароль с хэшами, то на самом деле делаете его слабее.
OriginalGriff
- Куда же? Я бы хотел ее прочесть.
И слабее чего? Обычный текст? Зашифровано? Имейте в виду, что зашифрованные пароли нуждаются в том, чтобы ключ был доступен всякий раз, когда вы хотите их использовать.
Kenneth Haugland
Я думал примерно так:
Войдите в систему, если GetHash(WrittenPassword)==StoredPasswordHash
имеет много => одно отношение
Если бы я использовал оригинальный пароль:
Войдите в систему, если WrittenPassword == StoredPassword
имеет:
один => одно отношение
Я что-то упустил?
OriginalGriff
Во-первых, когда вы хэшируете пароль, вы не просто хэшируете текст: вы хэшируете его значением "соли", которое уникально для пользователя (возможно, ID), так что два пользователя с одной строкой пароля генерируют разные хэши. Таким образом, вы не можете использовать знания об одном небезопасном пароле для доступа к нескольким учетным записям. Если десять пользователей имеют "пароль" в качестве пароля (а это происходит слишком часто), вы получаете десять различных хэшей, и вы не можете вернуться оттуда к исходному входу (поэтому любое значение, которое соответствует этому хэшу, обычно не может быть использовано).
Хранение паролей в виде обычного текста является простым, но серьезным риском для безопасности. Любой, кто может получить доступ к вашей базе данных (а это, вероятно, гораздо больше людей, чем вы думаете), получает идентификатор пользователя и пароль every-bodies бесплатно. Поскольку многие люди не могут запомнить более одного пароля, это дает им доступ к любой системе, к которой подключается ваш пользователь, в теории.
Хранение зашифрованных паролей также является серьезной угрозой безопасности! Подумайте об этом: шифрование требует расшифровки, прежде чем его можно будет использовать. Это означает, что ваша программа должна иметь доступ к ключу шифрования, используемому для шифрования пароля в первую очередь, каждый раз, когда вам нужно проверить, правильно ли пользователь ввел пароль. Существует очень хороший шанс, что любой, кто имеет доступ к вашей базе данных, также имеет доступ к исполняемым файлам и файлам данных вашей программы, поэтому ключ шифрования эффективно хранится вместе с данными, которые он "защищает".
Это противоречит интуиции, я знаю, но хэширование более безопасно, чем обычный текст и шифрование. Просто посмотрите на количество потерь данных за последние несколько лет: все они были связаны с системами, которые имеют систему "восстановления пароля" - что означает обычный текст или зашифрованное хранилище паролей - вместо системы "сброса пароля".
Kenneth Haugland
Понятно, если вы добавляете "соль", хэшированный пароль становится сильнее, если нет, то он слабее. Урок: вы должны сделать это правильно :-)