Шифрование не может быть отменено?


9

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

Тем не менее, если следующая строка всегда равна "dominic" (мое имя), тогда не может быть никакого логического способа изменить ее; быть не случайным и не основанным на дате / времени, но есть ли логический способ?

0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=

Независимо от того, что или сколько раз я шифрую "доминик" (строку), она всегда равна, как указано выше. Так не должен ли быть какой-нибудь способ расшифровки такой строки?

Пример того, о чем я говорю:

public string EncryptPassword(string password)
{
    return Convert.ToBase64String(
        System.Security.Cryptography.SHA256.Create()
        .ComputeHash(Encoding.UTF8.GetBytes(password)));
}

3
Вы говорите о криптографическом хэше имени (часто используется в паролях)? или шифрование (которое предназначено для расшифровки уполномоченным лицом)?

11
SHA256является криптографической хэш - функции , а не алгоритм шифрования. Это односторонняя функция .

1
Обязательный отказ от ответственности: солить хеш ( en.wikipedia.org/wiki/Salt_(cryptography) ). Кроме того, SHA256 имеет тенденцию быть слишком быстрым, чтобы не иметь проблем с атаками методом "грубой силы" с использованием, например, графических процессоров. Было бы рекомендовано использовать что-то вроде PBKDF2 или scrypt.
Мацей Пехотка

7
Хэширование похоже на мясорубку. Вы можете превратить корову в говяжий фарш, но не наоборот.
Нил МакГиган,

1
Вас смущает шифрование с открытым / закрытым ключом? Если кто-то еще зашифрует сообщение с помощью вашего открытого ключа, он не сможет самостоятельно расшифровать это сообщение. Только вы можете расшифровать это - и, возможно, АНБ, Моссад, ФСБ и Tiroler Geheimdienst.
ot--

Ответы:


39

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

Здесь вы смотрите на хэширование , которое отличается от шифрования, хотя криптографические методы часто используются при реализации хэширования. Идея хэша состоит в том, что он использует сложные математические методы для создания нового значения, которое отображается на старое значение, которое можно повторить. Там нет ключа, и это не должно быть полностью изменено. Криптографически сильный хеш создается с математическим свойством, которое, если у вас есть значение, Aчей хэш является значением B, очень и очень сложно преднамеренно создать другое значение, к Cкоторому также относятся хэши B.

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

Другое свойство сильного криптографического хэша состоит в том, что его очень трудно перевернуть. Вы знаете, что значение 0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=- это хеш для «доминиканства», потому что вы только что сработали, но если вы этого не знали и не знали, с чего начать, и все, что у вас было 0WrtCkg6IdaV/l4hDaYq3seMIWMbW+X/g36fvt8uYkE=, это могло буквально отнять у вас миллиарды лет, чтобы выяснить, что оригинал был "доминирующим", если хеш хороший. Опять же, это полезно для предотвращения побочного ущерба в случае кражи списка паролей.


2
Разве я не могу просто взять список известных слов и перебрать их, пока не найду совпадение хешей? Поэтому веб-сайты предлагают добавлять заглавные буквы и цифры в пароли, чтобы сделать их более безопасными?
user1477388

15
@ user1477388: Да, именно поэтому сайты предлагают это. Это хорошо известный способ атаковать хешированные пароли: по понятным причинам это называется «атака по словарю», а использование слов, которых нет в словаре, является важным шагом для защиты от них ...
Мейсон Уилер,

1
Похоже, что это хорошо понимает мою «неспособность поверить, что их нельзя как-то изменить» security.stackexchange.com/questions/11717/… Не то, чтобы я хотел / мне нужно что-то менять; Мне просто любопытно.
user1477388

3
Еще одно предложение - добавить что-то уникальное к каждому паролю перед его хэшированием. Однозначная разница в паролях создает совершенно другой хэш, идея состоит в том, что все ваши результаты будут уникальными. В противном случае, если хакер обнаружит хеш для слова «пароль123», он будет знать, что использовать его против ВСЕХ имен пользователей с этим конкретным хешем. Похоже, у вас есть хорошая голова для такого рода вещей, так что удачи.
Katana314

1
@MasonWheeler: использование слов, которых нет в словаре, на самом деле не является необходимым, особенно учитывая, что «словарь», используемый в типичной атаке, не похож на оксфордский словарь, а представляет собой список строк, о которых известно, что они часто используются в паролях. , Вместо того, чтобы пытаться избегать этих слов, лучше выбрать, скажем, 5 случайных слов из списка из 2000 слов или около того: такая фраза, даже если словарь из 2000 слов известен, почти в 100 раз дольше перебирает сила из 8 случайных символов из 64.
tdammers

9

То, что вы делаете, само по себе не является «шифрованием»; это "хеширование". Основное различие между ними состоит в том, что шифрование является легко обратимым (с правильным ключом, конечно), в то время как хеширование предназначено для очень трудно устранить при любых обстоятельствах, кроме зная исходное сообщение в первую очередь.

Теоретически, хэши имитируют «случайного оракула», гипотетического гомункула с эйдетической памятью и способом генерирования совершенно уникальных, совершенно случайных чисел без верхнего предела диапазона. Вы дадите этому маленькому человеку сообщение, и произойдет одно из двух; либо он никогда не видел сообщение раньше, и в этом случае он генерирует новое случайное число и дает его вам в качестве дайджеста, или он видел это сообщение раньше, и поэтому он запоминает и дает вам число, которое он сгенерировал, когда увидел его: первый раз. В этой теоретической модели нет нулевой взаимосвязи между сообщением и его дайджестом, и без единого числа, которое когда-либо дважды появлялось в ГСЧ, нет возможности для столкновения.

К сожалению, у нас нет идеального случайного оракула; Идея имеет практическую невозможность для цифровой реализации, такую ​​как способность оракула эффективно хранить и эффективно вспоминать каждое сообщение, когда-либо хешированное кем-либо, и способность клиентов принимать число, которое может быть сотнями или тысячами десятичных цифр. в длину. Вместо этого у нас есть хеш-функции, которые являются необратимыми (односторонними) математическими операциями, которые работают с самим сообщением, чтобы создать детерминированное преобразование (то же сообщение => тот же хеш) без видимыхсвязь между хешем и исходным сообщением. Как упомянуто в комментариях, также не должно быть никаких предсказуемых изменений в значении хеш-функции, получаемых путем систематических изменений в сообщении; в идеале, каждый бит дайджеста должен иметь 50% шанс измениться, учитывая изменение одного бита сообщения.

Есть много вариантов использования хэш-функции; они используются для проверки запроса (например, учетные данные для входа в систему, например пароли), при этом обеим сторонам не нужно знать секрет открытого текста, и они используются в качестве контрольных сумм для проверки того, что сообщение не было подделано или повреждено. Они также используются в так называемых сценариях «доказательства работы»; вычислительные задачи, которые трудно выполнить, но легко проверить.

Если бы вы когда-нибудь нашли способ эффективно перевернуть хеш-дайджест SHA256, чтобы создать сообщение (любое сообщение), которое привело бы к этому хешу, это было бы доказательством демонстрации того, что на самом деле хеш по сути сломан. SHA256, на самом деле, считается безопасным, то есть не существует документированного метода, независимо от того, насколько он практичен, чтобы начать с хеш-дайджеста и создать сообщение о коллизии, которое требует меньше работы, чем простое использование каждой возможности (что для SHA-256 в идеале 2 ^ 256 ~ = 10 ^ 77 возможностей).


Также стоит упомянуть, что в идеальной хеш-функции однобитное изменение на входе должно приводить к изменению на 50% выходных битов. Это называется лавинным эффектом .
CVn

2
@ MichaelKjörling: Точно говоря, следует ожидать, что каждый бит изменится с вероятностью 50%, что отличается от (но подразумевает), что в среднем ожидается изменение 50% битов.
Дитрих Эпп

@DietrichEpp Действительно, и статья в Википедии, на которую я ссылался, проясняет это, но конечному пользователю проще определить количество битов, измененных между двумя входами.
CVn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.