- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在用 Ruby on Rails 重建一个 PHP 网络应用程序,并且非常希望避免强制所有现有用户重置他们的加密密码。 PHP 站点将 mcrypt_encrypt 与 AES-256-ECB 结合使用,我终生无法使用 ruby 的 OpenSSL 获得相同的密文。我也无法解密它们(原则上这很好),因为实际存储在用户数据库中的是 AES 密文的 MD5 哈希值。
我已经阅读了之前这些密切相关的问题和非常有用的答案:
包括那里引用的页面,如果我理解正确的话,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)
我使用了一个额外的 gem(ruby-mcrypt)。似乎是 openssl 的问题。实际上,问题似乎是 Openssl 不支持零填充,而是使用无填充或默认 openssl 填充。由于您在 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]
希望这对您有所帮助。
关于php - 我可以在 ruby 中复制 PHP 的 AES 加密的确切行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6699908/
通过多次搜索和pytorch文档本身,我可以发现在嵌入层内部有一个查找表,用于存储嵌入向量。我无法理解的是: 在这一层的培训期间究竟发生了什么? 权重是多少,以及这些权重的梯度是如何计算的? 我的直觉
当应用程序有大量数据(400M)要写入非阻塞套接字时,write() 返回EWOULDBLOCK 或EAGAIN 当发送缓冲区变满时。 当套接字被(e)轮询时,我有时会看到发送缓冲区中有 7M 空间(
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我经常阅读一些编程语言对模块的支持(“一流”)(OCaml,Scala,TypeScript [?]),并且最近偶然发现了这样的答案,即在Scala的显着特征中引用模块作为一流公民。 我以为我很清楚模
我已经提交了一个自定义的开放图表故事,但它被拒绝并显示以下消息: 打开图表捐赠(行动类型)提交内容、操作、对象和使用说明必须以英文提交。您可以在应用程序面板的“本地化”选项卡中翻译操作和对象。 如果我
给定一个任意的 boolean 值列表,确定其中一个恰好为真的最优雅的方法是什么? 最明显的 hack 是类型转换:将 false 转换为 0,将 true 转换为 1,然后对它们求和,并返回 sum
这个问题在这里已经有了答案: When to use extern "C" in simple words? [duplicate] (7 个答案) 关闭 9 年前。 如果您想将此问题标记为重复问题
我是一名优秀的程序员,十分优秀!