Я наткнулся на этот вопрос, проведя некоторое исследование, и я думал, что должен внести свой вклад.
На самом деле, я считаю, что пароли должны быть не принимать любые символы. Проблема может возникнуть с символами, которые не относятся к стандартной таблице ASCII.
Возьмем, к примеру, буква ü
(в нижнем регистре у с умляут):
- В расширенном формате ASCII, что символ 0x81.
- В ISO-8859-1 (очень распространенный в западных странах) это 0xFC.
- В UTF-8
ü
имеет элемент кода U + 00FC, и, следовательно, может быть представлен в виде 0xC3BC
- В UTF-8 символ может быть также не нормируется, хотя. Таким образом, он может состоять из символа умлаута (только
¨
) плюс u
: результатом является другая другая последовательность байтов.
Во всех случаях над хешем для пароля будет отличаться, и логин завершится неудачно.
Возможное решение, позволяющее любому символу Юникода гарантировать, что вся страница использует UTF-8 повсюду и нормализует пароли (например, с режимом NFC) перед их хэшированием.
Однако в этот момент может быть проще просто запретить любой символ, который не является частью стандартной таблицы ASCII: байты 0x00-0x7F
или (еще лучше, дескрипторы управления и другие не представимые плюс символы перевода строки) 0x20-0x7E
.
Я не помню, чтобы какой-либо символ был проблемой, если вы используете заполнители, но я могу ошибаться, поскольку я не знаю всего рейнджера и других языков ... но, возможно, если вы используете UTF-8 и placeholder, это должно быть достаточно, чтобы принять что-либо. – Prix