Какая нормализация Unicode (и другая обработка) подходит для паролей при хешировании?

Если я принимаю полный Unicode для паролей, как мне нормализовать строку перед передачей ее хеш-функции?

Цели

Без нормализации, если кто-то установит свой пароль «mañana» (ma\u00F1ana) на одном компьютере и попытается войти в систему с помощью «mañana» (ma\u006E\u0303ana) на другом компьютере, хэши будут другими, и вход не удастся. Это находится под контролем пользовательского агента или его операционной системы.

  • Я хотел бы убедиться, что эти хэши относятся к одному и тому же.
  • Меня не беспокоят гомоглифы, такие как Α, А и A (греческий, кириллица, латиница).

Ссылка

Формы нормализации Unicode: http://unicode.org/reports/tr15/#Norm_Forms

Соображения

  • Любая процедура нормализации может вызвать коллизии, например. "office" == "office".
  • Нормализация может изменить количество байтов в строке.

Дальнейшие вопросы

  • Что произойдет, если сервер получит последовательность байтов, которая не является допустимой UTF-8 (или другим форматом)? Отклонить, так как его нельзя нормализовать?
  • Что произойдет, если сервер получит символы, не назначенные в его версии Unicode?

person treat your mods well    schedule 23.04.2013    source источник
comment
Вас в первую очередь беспокоят пользователи, использующие разные методы ввода на разных устройствах? Ваш пример включает лигатуры, но как насчет объединения и объединения нулевой ширины? Как насчет похожих, но семантически различных кодовых точек, таких как I (латинская буква) vs Ⅰ (римская цифра) vs I (полная ширина CJK)?   -  person Mike Samuel    schedule 23.04.2013
comment
Меня не беспокоят гомоглифы — маловероятно, что они смогут набрать весь свой пароль, используя метод ввода, который разделяет только некоторые (почти) глифы — но мне нужно подумать о столярах. Возможно, подготовка Unicode для хеширования паролей требует гораздо более тщательного подхода.   -  person treat your mods well    schedule 24.04.2013


Ответы (1)


Нормализация не определена в случае искаженных входных данных, таких как предполагаемый текст UTF-8, который содержит недопустимые последовательности байтов. Недопустимые байты могут интерпретироваться по-разному в разных средах: отклонение, замена или пропуск.

Рекомендация №1. По возможности отклоняйте входные данные, не соответствующие ожидаемой кодировке. (Однако это может быть вне контроля приложения.)

Приложение 15 Unicode гарантирует стабильность нормализации, когда ввод содержит только назначенные символы:

11.1. Стабильность нормализованных форм

Для всех версий, даже до Unicode 4.1, применяется следующая политика:

Нормализованная строка гарантированно стабильна; то есть после нормализации строка нормализуется в соответствии со всеми будущими версиями Unicode.

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

Рекомендация № 2. Какая бы форма нормализации ни использовалась, она должна использовать Процесс нормализации для стабилизированных Строки, т. е. отклоняют любые вводимые пароли, содержащие неназначенные символы, поскольку их нормализация не гарантируется стабильной при обновлении сервера.

Формы нормализации совместимости, похоже, лучше справляются с японским языком, сводя несколько декомпозиций в один и тот же вывод, в отличие от канонических форм.

Спецификация предупреждает:

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

Однако семантика и круговой обмен здесь не имеют значения.

Рекомендация №3: применяйте NFKC или NFKD перед хэшированием.

person treat your mods well    schedule 23.04.2013
comment
Хороший ответ. Было бы лучше со ссылками на RFC 4013 (ietf.org/rfc/rfc4013.txt) и его грядущая замена, saslprepbis (tools.ietf.org/html /draft-ietf-precis-saslprepbis-07). - person Joe Hildebrand; 07.10.2014
comment
О, хорошие ссылки! Вы хотите отредактировать ответ, чтобы включить их? Боюсь, что все мои знания о нормализации Unicode сейчас утеряны. :-( - person treat your mods well; 08.10.2014
comment
Эти ссылки были заменены. RFC 7613 (tools.ietf.org/html/rfc7613) отменяет RFC 4013, а PRECIS framework (tools.ietf.org/html/rfc7564) — это конечный результат процесса saslprepbis. . - person devstuff; 18.03.2017
comment
NFKD - это путь, если вы используете NFKC и новый предварительно составленный символ добавляется в Unicode, тогда результат будет другим. - person alextgordon; 13.09.2018