Будут ли проблемы с использованием шифрования с закрытым/открытым ключом для сохранения пароля?

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

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

Однако этот метод, по-видимому, не получил широкого распространения. Так есть ли недостатки? Если да, то какие?


person aufziehvogel    schedule 16.12.2011    source источник
comment
Как бы вы это проверили?   -  person SLaks    schedule 16.12.2011
comment
Я бы еще раз зашифровал ввод одним и тем же открытым ключом и проверил, будет ли вывод таким же. То же, что и с алгоритмами хеширования.   -  person aufziehvogel    schedule 16.12.2011
comment
Существуют ли схемы шифрования, которые дополняют ввод случайными байтами? Если это так, вы должны быть уверены, что не используете их...   -  person cHao    schedule 16.12.2011


Ответы (2)


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

Во-вторых, вы по-прежнему страдаете от ограниченной энтропии при шифровании с открытым ключом, ваша битовая строка по-прежнему будет ограничена. Если вам нужно больше битов, используйте хэш с большим внутренним состоянием (SHA-512, Whirlpool и т. д.).

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

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

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

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

person Thomas    schedule 16.12.2011
comment
Более низкая производительность может быть преимуществом для паролей; это замедлит проверку пароля настолько, что грубая сила займет столетия, в то время как законные пользователи едва заметят это. - person cHao; 16.12.2011
comment
Вы можете просто повторить хеш, если это вас беспокоит - у iirc md5 был официальный стандарт для повторного хеширования. - person Thomas; 16.12.2011

Есть несколько недостатков. Среди них:

  • Теперь у вас есть токен, который необходимо защитить. Если кто-то получит ваш секретный ключ, у него будут все пароли, зашифрованные этим ключом. Асимметричное шифрование менее проблематично, если вы «теряете» закрытый ключ, но вам лучше молиться, чтобы все его копии исчезли. Хэши не могут быть расшифрованы, и точка.
  • Зашифрованный пароль может быть практически любой длины, поэтому для его хранения потребуется довольно большое поле в базе данных (или ограничение длины открытого текста). Хэши имеют известную длину.
  • Если вы можете расшифровать пароль, вы его знаете. Если когда-либо возникала проблема с тем, что кто-то использовал этот пароль для взлома чего-то другого, все, кто знал, что этот пароль принадлежит этому пользователю, были подозреваемыми. Это теперь значит ты. Даже если вы используете одностороннее шифрование в качестве хэша, вам лучше иметь возможность доказать, что вы не можете его расшифровать — и тогда, если вы не хотите его расшифровывать, зачем шифровать?

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

person cHao    schedule 16.12.2011