22.2. Человеческая память
373
Первый прием состоит в том, чтобы добавить
соли (salt)
. “Соль” — это
случайное число, которое хранится вместе с данными, зашифрованными с по-
мощью пароля. Если это возможно, используйте 256-битовую соль.
Следующий шаг — это
растягивание (stretching)
пароля. По своей сути
растягивание представляет собой очень длинный процесс вычисления. Пусть
p
— это пароль, а
s
— соль. Используя любую криптографически сильную
функцию хэширования
h
, можно вычислить следующее:
x
0
:= 0
,
x
i
:=
h
(
x
i
−
1
k
p
k
s
)
для
i
= 1
, . . . , r,
K
:=
x
r
.
Полученное значение
K
применяется в качестве ключа для фактического
шифрования данных. Параметр
r
— это количество итераций данного алго-
ритма, которое должно быть настолько большим, насколько это практически
возможно. (Думаем, нам не нужно лишний раз подчеркивать, что значения
x
i
и
K
должны быть 256 бит длиной.)
Рассмотрим описанный процесс с точки зрения злоумышленника. Зная
соль
s
и некоторые данные, зашифрованные с помощью ключа
K
, мы пыта-
емся найти
K
, перебирая различные пароли. Для этого мы выберем некото-
рый пароль
p
, вычислим соответствующее значение
K
, расшифруем данные
и посмотрим, имеет ли смысл полученный открытый текст. Если расшифро-
ванный текст окажется бессмысленным, выбранный пароль
p
должен быть
неправильным. Чтобы проверить одно значение
p
, необходимо выполнить
r
различных операций хэширования. Чем больше значение
r
, тем больше ра-
боты придется проделать злоумышленнику.
В нормальных ситуациях растягивание пароля должно выполняться при
каждом использовании последнего. Напомним, что это происходит в тот мо-
мент, когда пользователь только что ввел пароль. Обычно ввод пароля за-
нимает несколько секунд, поэтому вполне допустимо потратить на его обра-
ботку, скажем, еще 200 мс. Вот наше правило выбора
r
: значение
r
долж-
но быть таким, чтобы вычисление
K
(
s, p
)
занимало от 200 до 1000 мс на
оборудовании пользователя. С течением времени компьютеры работают все
быстрее и быстрее, поэтому
r
должно постепенно увеличиваться. В идеале
приемлемое значение
r
следует определять экспериментальным путем, когда
пользователь впервые выбирает пароль, и хранить
r
вместе с
s
. (Обязательно
убедитесь, что значение
r
не слишком мало и не слишком велико.)
Какой выигрыш мы получили? Если
r
= 2
20
(это чуть больше милли-
она), тогда злоумышленнику для проверки каждого варианта пароля при-
дется проделать по
2
20
операции хэширования. Перебор
2
60
паролей требует
выполнения
2
80
операций хэширования, поэтому использование
r
= 2
20
экви-