我正在生成要从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) 这个问题是我最后一个问题的延续,关于如何使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) 我遇到了这里描述的问题的变体:
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'方案中)也没有.
有可行的解决方法吗?
我偶尔会遇到形式为Array(value),String(value)和Integer(value)的转换.在我看来,这些只是调用相应的value.to_a,value.to_s或value.to_i方法的语法糖.
所以我想知道:
这些可以用于类型通用强制吗?也就是说,我可以做一些事情
[Integer, String, Array].each {|klass| klass.do_generic_coercion(foo) }
Run Code Online (Sandbox Code Playgroud)?(...和不,我真的不想这样做;我知道我想要的类型,但我希望避免案例陈述.)