添加对 Unicode 密码的支持是开发人员不应忽视的重要功能。
尽管如此,在密码中添加对 Unicode 的支持仍然是一项棘手的工作,因为相同的文本可以在 Unicode 中以不同的方式进行编码,并且您不希望因此阻止人们登录。
假设您将密码存储为 UTF-8,请注意这个问题与 Unicode 编码无关,而是与Unicode 规范化.
现在的问题是你应该如何正常化Unicode 数据?
您必须确保能够进行比较。您需要确保下一个 Unicode 标准发布时不会使您的密码验证失效。
注意:仍然有一些地方可能永远不会使用 Unicode 密码,但这个问题与为何或何时使用 Unicode 密码 https://stackoverflow.com/questions/1797777/should-i-support-unicode-in-passwords,这是关于如何以正确的方式实施它们。
第一次更新
是否可以在不使用 ICU 的情况下实现这一点,就像使用操作系统进行标准化一样?
阅读是一个好的开始Unicode TR 15:Unicode 规范化形式 http://unicode.org/reports/tr15/。然后你意识到这是一项繁重的工作并且容易出现奇怪的错误 -你可能已经知道这部分了,因为你在这里问。最后,你下载类似的东西ICU http://site.icu-project.org/ and 让它为你做 http://userguide.icu-project.org/transforms/normalization.
IIRC,这是一个多步骤的过程。首先,分解序列直到无法进一步分解 - 例如 é 将变成 e + ´。然后将序列重新排序为明确的订购。最后,您可以使用 UTF-8 或类似的方式对生成的字节流进行编码。 UTF-8 字节流可以输入您选择的加密哈希算法并存储在持久存储中。当您想要检查密码是否匹配时,请执行相同的过程并将哈希算法的输出与数据库中存储的内容进行比较。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)