代码之家  ›  专栏  ›  技术社区  ›  sorin

如何正确实现Unicode密码?

  •  8
  • sorin  · 技术社区  · 16 年前

    添加对Unicode密码的支持是开发人员不应忽视的一个重要特性。

    尽管如此,在密码中添加对Unicode的支持仍然是一项棘手的工作,因为相同的文本可以用不同的方式在Unicode中编码,并且您不希望因此而阻止人们登录。

    假设您将密码存储为UTF-8,请注意,这个问题与Unicode编码无关,而是与 万国码规范化 .

    现在的问题是你应该怎么做 正常化

    你必须确定你能比较它。您需要确保下一个Unicode标准发布时不会使您的密码验证无效。

    注意:仍然有一些地方可能永远不会使用Unicode密码,但这个问题不是关于 why or when to use Unicode passwords

    有没有可能在不使用ICU的情况下实现这一点,比如使用OS进行规范化?

    2 回复  |  直到 9 年前
        1
  •  6
  •   D.Shawley    16 年前

    读书是个好的开始 Unicode TR 15: Unicode Normalization Forms . 然后你会意识到这是一个很大的工作,并容易出现奇怪的错误- . 最后,你可以下载 ICU 和 let it do it for you .

    IIRC,这是一个多步骤的过程。首先分解序列,直到不能进一步分解-例如将变成e+。然后你把序列重新排列成 明确的 订购。最后,您可以使用UTF-8或类似的方法对结果字节流进行编码。UTF-8字节流可以输入到您选择的加密散列算法中,并存储在持久存储中。如果要检查密码是否匹配,请执行相同的过程,并将哈希算法的输出与数据库中存储的内容进行比较。

        2
  •  0
  •   Steven R. Loomis    16 年前

    一个问题回到你-你能解释为什么你加上“不使用重症监护室”?我看到很多问题问ICU做的(我们认为)很好,但“没有使用ICU”。只是好奇。

    其次,您可能对StringPrep/NamePrep感兴趣,而不仅仅是规范化: StringPrep

    UTR#36 和 UTR#39 其他Unicode安全问题。

    * (披露:ICU开发商:)

    推荐文章