С двухсторонним шифрованием вроде все понятно: "Соль" спрятана в зашифрованном виде.
С односторонним тоже надеюсь понятно: "Соль" может лежать открыто в базе.
Вот например результат хэш функции:
йцукПетя -> fghfhvps
енгшПетя -> opjercjf
ячсмПетя -> xidmsarj
В базе мы храним "соль", хэши и емайл:
Код:
СОЛЬ | ХЭШИ |Е-МАЙЛ (unique index)
-----+----------+------------------------
йцук | fghfhvps | a@a.ru
енгш | opjercjf | b@a.ru
ячсм | xidmsarj | c@a.ru
Зачем нам понадобился е-майл? Затем что в базе есть 3 Пети.
Для того что бы выбрать одного, надо еще одно условие: допустим е-майл (уникальный для каждого).
Теперь я хочу проверить: есть ли "Петя" с е-майлом "b@a.ru".
Что я делаю:
1. Ищу соль которая соответствует е-майлу: "b@a.ru" (результат: енгш)
2. Присоединяю соль к имени Петя (результат: енгшПетя)
3. Хэширую "енгшПетя" (результат: opjercjf)
4. Ищу есть ли строка с хэшем "opjercjf" и е-майлом "b@a.ru". Если есть - авторизация прошла успешно!
Я правильно рассуждаю тут?
----------------------------------
Теперь про недостатки и достоинства обеих методов.
Сценарий:
- злоумышленник получил доступ к базе и ключ (с помощью которого шифровались данные).
- он также знает алгоритм шифровальной программы.
Увы, в первом случае (двухстороннее шифрование) он сможет легко прочесть имена (йцукПетя).
Все что ему надо сделать это: отделить соль (йцук) от имени (Петя).
Во втором случае (одностороннее хеширование) он может попытаться успешно авторизироваться, что бы найти имя.
Злоумышленник знает (пример первой записи):
1. ключ (использованный для хэширования)
2. соль "йцук",
3. е-майл "a@a.ru",
4. результат хэширования "fghfhvps"
Ему надо найти имя чтобы авторизироваться (в данном случае "Петя").
Я не знаю придется ли ему перебирать все имена для этой записи?