我正在使用Ruby on Rails重建PHP Web应用程序,并且非常希望避免强制所有现有用户重置其加密密码. PHP网站使用mcrypt_encrypt与AES-256-ECB,我不能在我的生活中使用ruby的OpenSSL获得相同的密文.我也无法解密它们(原则上是好的)因为实际存储的是用户DB是AES密文的MD5哈希值.
我已经阅读了这些以前密切相关的问题以及非常有用的答案:
> How to make Ruby AES-256-CBC and PHP MCRYPT_RIJNDAEL_128 play well together
> Part II: How to make Ruby AES-256-CBC and PHP MCRYPT_RIJNDAEL_128 play well together
包括那里引用的页面,如果我理解正确,PHP和ruby实现使用不同的填充方法.既然我必须接受PHP方面的工作方式,有没有办法在某种程度上强制在ruby / OpenSSL上使用相同的填充方法?我正在使用ruby 1.9.2-p180.
这是PHP中的示例代码:
$salt = "12345678901234567890123456789012";
$plain = "password";
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$cipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $plain, MCRYPT_MODE_ECB, $iv);
echo md5($cipher);
输出:6337137fd88148250fd135a43dbeb84a
在ruby中:
require 'openssl'
salt = "12345678901234567890123456789012"
plain = "password";
c = OpenSSL::Cipher.new("AES-256-ECB")
c.encrypt
c.key = salt
cipher = c.update(plain)
cipher << c.final
puts Digest::MD5.hexdigest(cipher)
输出:18dee36145c07ab83452aefe2590c391
解决方法:
实际上通常不是一个openssl解决方案,但也许你可以有一个有效的例子.
require 'mcrypt'
require 'openssl'
plaintext = 'password'
puts plaintext
key = '12345678901234567890123456789012'
enc = Mcrypt.new(:rijndael_256, :ecb, key, nil, :zeros)
encrypted = enc.encrypt(plaintext)
puts Digest::MD5.hexdigest(encrypted)
我使用了额外的宝石(ruby-mcrypt).似乎是openssl的一个问题.实际上问题似乎是Openssl不支持零填充并使用no-padding或default-openssl-padding.由于你在php中使用零填充这一事实你必须在ruby中使用零填充.
在我的机器上输出php脚本:
[~/test] ➔ php5 t.php
6337137fd88148250fd135a43dbeb84a
并为ruby脚本:
[~/test] ➔ ruby t2.rb
password
6337137fd88148250fd135a43dbeb84a
和我的ruby版本:
[~/test] ➔ ruby -version
ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]
希望这可以帮助.
原文地址:https://codeday.me/bug/20190530/1186647.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。