【问题标题】:Ruby PHP MD5 Incompatible - How is this possible?Ruby PHP MD5 不兼容 - 这怎么可能?
【发布时间】:2013-02-15 17:52:32
【问题描述】:

这怎么可能?我无法让 Ruby 为我提供与 PHP 相同的 MD5,也无法解决这个问题……我认为是编码,但似乎我已经设法让每个文件都保持相同的格式。

PHP 代码:(结果:bfa7df865d9f4aff62c4643d0e1cb33b)

echo md5("9jdaksjdfosdjsljz91m1wms0zkzd0k0askd1m2l3!@3@#@akskd9");

带有 Digest-MD5 的 Ruby 代码:(结果:bd53907a1b47e9a381ee663ec75b59f4)

require 'digest/md5'
puts Digest::MD5.hexdigest("9jdaksjdfosdjsljz91m1wms0zkzd0k0askd1m2l3!@3@#@akskd9")

带有 HMAC-MD5 的 Ruby 代码:(结果:d41d8cd98f00b204e9800998ecf8427e)

require 'hmac-md5'
puts HMAC::MD5.new("9jdaksjdfosdjsljz91m1wms0zkzd0k0askd1m2l3!@3@#@akskd9").hexdigest

【问题讨论】:

  • ! 后面的换行符可能与它有关
  • 马克,这是我不知道的控制序列吗?因为我根本没有换行符......除非它是通过像 \n 这样的控制序列或其他东西,我没有......
  • 您的帖子中显示的代码中似乎有换行符
  • 不,它是使用单引号修复的,见下文。这似乎是一个奇怪的红宝石怪癖。

标签: php ruby md5


【解决方案1】:

用单引号代替双引号

Digest::MD5.hexdigest('9jdaksjdfosdjsljz91m1wms0zkzd0k0askd1m2l3!@3@#@akskd9')

【讨论】:

  • @RomanMittermayr 那么您的代码中的 PHP 和 Ruby 输入之间肯定存在细微差别。我刚刚在我的电脑上运行它并得到了bfa7df865d9f4aff62c4643d0e1cb33b
  • 是的,但我意识到我使用的是单引号,这会有所不同。现在检查我的答案。
  • 因为字符串在双引号内的评估方式不同,而哈希 # 字符将其丢弃。老实说,我不完全确定为什么(因为我相信用于在字符串中包含变量的 ruby​​ 控制序列是#{...}(注意花括号)。
  • #@akskd9 将尝试包含名为 akskd9 的实例变量。关键部分是#@,而不仅仅是#
  • 专业提示:除非您正在插值或需要特殊转义符,否则不要对字符串使用双引号,默认为单引号,以便双引号可以提醒您检查字符串的插值。
【解决方案2】:

正是“#@”的组合使得它想将字符串末尾的“@akskd9”视为一个变量。

例如:

@akskd9 = "foobar"
puts "9jdaksjdfosdjsljz91m1wms0zkzd0k0askd1m2l3!@3@#@akskd9"

=> 9jdaksjdfosdjsljz91m1wms0zkzd0k0askd1m2l3!@3@foobar

..没有#,那么它会忽略@符号:

@akskd9 = "foobar"
puts "9jdaksjdfosdjsljz91m1wms0zkzd0k0askd1m2l3!@3@@akskd9"

=> 9jdaksjdfosdjsljz91m1wms0zkzd0k0askd1m2l3!@3@@akskd9

...有趣的是,如果 # 后面没有 {...},它会将字符串的其余部分视为变量。

@ak = "foobar"
puts "9jdaksjdfosdjsljz91m1wms0zkzd0k0askd1m2l3!@3@#@akskd9"

=> 9jdaksjdfosdjsljz91m1wms0zkzd0k0askd1m2l3!@3@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2015-06-19
    • 1970-01-01
    • 2023-03-21
    • 2011-01-31
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多