小编don*_*ndo的帖子

如何使Ruby AES-256-CBC和PHP MCRYPT_RIJNDAEL_128一起发挥得很好

我正在生成要从Ruby堆栈发送到PHP堆栈的数据.我在Ruby端使用OpenSSL :: Cipher库,在PHP使用'mcrypt'库.当我在Ruby中使用'aes-256-cbc'(256位块大小)进行加密时,我需要在PHP中使用MCRYPT_RIJNDAEL_128(128位块大小)来解密它.我怀疑Ruby代码坏了,因为cipher.iv_len是16; 我相信它应该是32:

>> cipher = OpenSSL::Cipher::Cipher.new('aes-128-cbc')
=> #<OpenSSL::Cipher::Cipher:0x3067c5c>
>> cipher.key_len
=> 16
>> cipher.iv_len
=> 16
>> cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
=> #<OpenSSL::Cipher::Cipher:0x306de18>
>> cipher.key_len
=> 32
>> cipher.iv_len
=> 16
Run Code Online (Sandbox Code Playgroud)

所以这是我的考试.在Ruby方面,首先我生成密钥和iv:

>> cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
>> cipher.encrypt
>> iv = cipher.random_iv
>> iv64 = [iv].pack("m").strip
=> "vCkaypm5tPmtP3TF7aWrug=="
>> key = cipher.random_key
>> key64 = [key].pack("m").strip
=> "RIvFgoi9xZaHS/0Bp0J9WDRyND6Z7jrd3btiAfcQ8Y0="
Run Code Online (Sandbox Code Playgroud)

然后我使用这些密钥进行加密:

>> plain_data = "Hi, Don, this is a string."
>> cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
>> cipher.encrypt
>> cipher.key = Base64.decode64(key64)
>> …
Run Code Online (Sandbox Code Playgroud)

php ruby openssl aes mcrypt

10
推荐指数
2
解决办法
9195
查看次数

第二部分:如何使Ruby AES-256-CBC和PHP MCRYPT_RIJNDAEL_128一起发挥得很好

这个问题是我最后一个问题的延续,关于如何使Ruby AES-256-CBC和PHP MCRYPT_RIJNDAEL_128一起发挥得很好.我现在已经开始工作,但我仍然在努力朝着另一个方向努力.PHP生成的密码似乎具有提供的所有信息,但是我无法使用Ruby代码来解密它而不会出现错误.

这是我用来生成密码的PHP代码:

$cleartext = "Who's the clever boy?";
$key = base64_decode("6sEwMG/aKdBk5Fa2rR6vVw==\n");
$iv = base64_decode("vCkaypm5tPmtP3TF7aWrug==");
$cryptogram = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $cleartext, MCRYPT_MODE_CBC, $iv);
$result = base64_encode($cryptogram);
print "\n'$result'\n";

RESULT
'JM0OxMINPTnF1vwXdI3XdKI0KlVx210CvpJllFja+GM='
Run Code Online (Sandbox Code Playgroud)

然后这是尝试在Ruby中解密:

>> cipher = OpenSSL::Cipher::Cipher.new('aes-128-cbc')
>> cipher.key = Base64.decode64("6sEwMG/aKdBk5Fa2rR6vVw==\n")
>> cipher.iv = Base64.decode64("vCkaypm5tPmtP3TF7aWrug==")
>> cryptogram = Base64.decode64('JM0OxMINPTnF1vwXdI3XdKI0KlVx210CvpJllFja+GM=')
>> cleartext = cipher.update(cryptogram)
=> "Who's the clever"
>> cleartext << cipher.final
OpenSSL::Cipher::CipherError: bad decrypt
 from (irb):100:in `final'
 from (irb):100
Run Code Online (Sandbox Code Playgroud)

令人沮丧的是,可以从加密字符串中获取整个明文.重复上述内容,但在密码中添加一个无意义的填充:

  >> cleartext = cipher.update(cryptogram + 'pad')
  => "Who's the clever …
Run Code Online (Sandbox Code Playgroud)

php ruby openssl aes mcrypt

10
推荐指数
1
解决办法
3048
查看次数

:包含和表别名

我遇到了这里描述的问题的变体:

ActiveRecord非常不可预测地为关联连接分配表别名.与给定表的第一个关联保留了表名.与该表的关联的进一步连接使用别名,包括路径中的关联名称......但是应用程序开发人员通常不在编码时知道[其他]连接.

在我的情况下,我被has_many和include的有毒混合物所困扰.我的架构中的许多表都有一state列,而has_many想要在该列上指定条件:has_many :foo, :conditions => {:state => 1}.但是,由于状态列出现在许多表中,因此我通过显式指定表名来消除歧义:has_many :foo, :conditions => "this_table.state = 1".

到目前为止,这种方法运行良好,为了提高效率,我想添加一个:include预加载相当深的数据树.这会导致表在不同的代码路径中不一致地出现别名.我对上面引用的票证的解读是这个问题不是也不会在Rails 2.x中修复.但是,我没有看到任何方法来应用建议的解决方法(在查询中明确指定别名表名称).我很高兴在has_many语句中明确指定表别名,但我没有看到任何方法这样做.因此,解决方法似乎不适用于这种情况(我认为,在许多'named_scope'方案中)也没有.

有可行的解决方法吗?

ruby-on-rails

9
推荐指数
1
解决办法
2402
查看次数

Ruby Integer(),Array()等等 - 它们是什么?他们来自哪里?

我偶尔会遇到形式为Array(value),String(value)和Integer(value)的转换.在我看来,这些只是调用相应的value.to_a,value.to_s或value.to_i方法的语法糖.

所以我想知道:

  • 这些定义在哪里/如何定义?我无法在Object,Module,Class等中找到它们
  • 是否有任何常见的场景,最好使用它们而不是相应的/底层的to_X方法?
  • 这些可以用于类型通用强制吗?也就是说,我可以做一些事情

    [Integer, String, Array].each {|klass| klass.do_generic_coercion(foo) }
    
    Run Code Online (Sandbox Code Playgroud)

?(...和不,我真的不想这样做;我知道我想要的类型,但我希望避免案例陈述.)

ruby ruby-on-rails

5
推荐指数
2
解决办法
1808
查看次数

标签 统计

ruby ×3

aes ×2

mcrypt ×2

openssl ×2

php ×2

ruby-on-rails ×2