我目前正在为 Web 服务设计登录。我将使用 PBKDF2 实现对密码进行哈希处理。
但是,我打算允许密码使用 unicode,因为我将拥有国际用户,他们可能想要使用例如西里尔字符。为了避免 unicode 歧义的任何问题,我想在将密码编码为 utf8 并将其传递给哈希之前使用 NFC unicode 规范化。
现在的问题是:这是安全的,还是会在密码验证中引入任何不必要的歧义?很明显,"a\u0308"
(a + 组合分叉)和"ä"
应该是相同的,但是 NFC 是否折叠了用户可能依赖的更多差异?
编辑:
我发现有一个名为SASLprep (RFC 4013)的 stringprep ( RFC 3454 ) 配置文件,它在某些协议中似乎用于密码和用户名。它指定使用 KD 归一化,我认为这是一个坏主意。它将折叠差异,例如和,这至少是西方世界键盘上常见的两个字符,可用于丰富密码熵。不幸的是,没有给出任何理由。²
2