약간의 연구를하면서이 질문에 비틀 거리며 나는 기여해야한다고 생각했습니다.
사실, 암호는 이 아니어야합니다.은 모든 문자를 허용해야합니다. 이 문제는 표준 ASCII 테이블에 포함되지 않은 문자가있을 수 있습니다.
테이크는, 예를 들어, 문자 ü
(움라우트와 소문자 U) : 확장 된 ASCII에서
- 은, 그 문자를 0x81입니다.
- ISO-8859-1 (서양 국가에서 매우 일반적 임)에서는 0xFC입니다. UTF-8에서
ü
- 는 코드 포인트 U + 00FC 있고, 따라서 캐릭터는 비록 정규화되지 않을 수도 UTF-8 0xC3BC
- 으로서 표현 될 수있다. 따라서 움라우트 문자 (단지
¨
)와 u
으로 구성 될 수 있습니다. 결과는 또 다른 바이트 시퀀스입니다.
암호 해시 위의 모든 경우에서 로그인이 실패합니다.
유니 코드 문자를 허용하는 가능한 해결책은 전체 페이지에서 모든 곳에서 UTF-8을 사용하고 해시하기 전에 (예 : NFC 모드로) 암호를 정규화하는 것입니다.
그러나이 시점에서 표준 ASCII 테이블에 포함되지 않은 문자 (바이트 0x00-0x7F
)를 허용하지 않는 것이 더 쉬울 수 있습니다 (제어 문자를 제거하는 것이 더 좋고 표현할 수없는 문자와 개행을하지 않는 문자가 더 좋음) 0x20-0x7E
.
자리 표시자를 사용하는 경우 문제가되는 문자는 기억이 안나지만 전체 레인저와 다른 언어는 모르지만 잘못되었을 수도 있습니다.하지만 UTF-8을 사용하고 자리 표시자를 사용해야하는 경우 무엇이든 받아들이기에 충분합니다. – Prix