【问题标题】:Play! hash password returns bad result玩!哈希密码返回错误结果
【发布时间】:2011-09-10 21:12:24
【问题描述】:

我使用的是 Play 1.2.1。我想散列我的用户密码。我认为Crypto.passwordHash 会很好,但事实并非如此。 passwordHash 文档说它返回 MD5 密码哈希。我在夹具中创建了一些用户帐户,我将 md5 密码散列在其中:

  ...
User(admin):
  login: admin
  password: f1682b54de57d202ba947a0af26399fd
  fullName: Administrator
  ...

问题是,当我尝试登录时,使用以下内容:

user.password.equals(Crypto.passwordHash(password))

它不起作用。所以我在我的autentify 方法中放了一条日志语句:

Logger.info("\nUser hashed password is %s " +
                    "\nPassed password is %s " +
                    "\nHashed passed password is %s",
                    user.password, password, Crypto.passwordHash(password));

而且密码哈希确实不同,但是嘿! passwordHash 方法的输出甚至不是 MD5 哈希:

15:02:16,164 INFO  ~
User hashed password is f1682b54de57d202ba947a0af26399fd
Passed password is <you don't have to know this :P>
Hashed passed password is 8WgrVN5X0gK6lHoK8mOZ/Q==

那怎么样?如何解决?或者也许我必须实施自己的解决方案?

【问题讨论】:

  • 我想你可能会喜欢下面链接中的答案,它建议如何在 java 中使用 md5 stackoverflow.com/questions/415953/generate-md5-hash-in-java
  • 顺便说一句,使用简单的 MD5-Hash 作为密码并不是很聪明。另外至少应该有一种盐。
  • @niels - 我知道,但这只是一个简单的学习游戏示例项目!

标签: hash passwords md5 playframework


【解决方案1】:

Crypto.passwordHash 返回 base64 编码的密码哈希,而您正在与十六进制编码进行比较。

【讨论】:

  • 我个人认为文档应该提到这个细节。
【解决方案2】:

正如 Nickolay 所说,您正在比较 Hex 和 Base-64 字符串。另外,我建议使用BCrypt,而不是 Play 的 Crypto 工具。

【讨论】:

    【解决方案3】:

    MD5 输出 16 个字节 的序列,每个字节(可能)具有 0 到 255(含)之间的任何值。当您想要打印该值时,您需要将字节转换为“可打印字符”序列。有几种可能的约定,其中两个主要是 hexadecimalBase64

    在十六进制表示法中,每个字节值表示为两个“十六进制数字”:这样的数字可以是十进制数字('0' 到 '9')或字母(从 'a' 到 'f',大小写无关紧要)。 16 个字节因此变成 32 个字符。

    在 Base64 编码中,每组三个连续字节被编码为四个字符,包含 64 个可能的字符(数字、小写字母、大写字母、“+”和“/”)的列表。可以添加一个或两个最后的“=”符号,以便编码的字符串由多个字符组成,该字符数是 4 的倍数。

    这里,'8WgrVN5X0gK6lHoK8mOZ/Q==' 是 16 字节序列的 Base64 编码,第一个值为 241,第二个值为 104,然后为 43,依此类推。在十六进制表示法中,第一个字节将由“f1”表示,第二个字节由“68”表示,第三个字节由“2b”表示……而完整的 16 个字节序列的十六进制表示法则为“f1682b54de57d202ba947a0af26399fd”,该值你所期望的。

    play.libs.Codec 类包含解码和编码 Base64 和十六进制符号的方法。它还包含Codec.hexMD5(),它执行 MD5 哈希并以十六进制表示法返回值,而不是 Base64。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多