作为NodeJS用户,如何使用ruby OpenSSL库进行加密?

时间:2016-03-26 02:15:50

标签: ruby node.js encryption

我是Node开发人员,但每隔一段时间我就可以使用ERB模板。我真的尽可能多地在这些模板中拉出红宝石,这个想法引起了我的注意。

我有这个配置值,应加密,但是以纯文本形式出现。程序会像这样解密它:

var crypto = require('crypto');

var decipher = crypto.createDecipher('aes256', 'e20jhciwjf90u2r9u9ujj');
var decrypted = crypto.update('4ufujj90u19ru90u109u') + crypto.final();

我想知道如何使用ruby为上面的内容创建加密字符串?

到目前为止,我有:

require 'openssl'

cipher = OpenSSL::Cipher::Cipher.new('aes256');
cipher.key= 'e20jhciwjf90u2r9u9ujj'

encrypted = cipher.update('my cat is yellow and very pretty.') + cipher.final

我遇到两个问题:

  1. 我常常在红宝石方面得到Key length not long enough error
  2. Ruby输出一堆疯狂的十六进制,而节点似乎总是需要/ utf8
  3. 我是否安全加密/解密?
  4. 有没有办法通过这两个API进行普遍的翻译/工作?

1 个答案:

答案 0 :(得分:0)

  1. AES-256使用256位密钥,默认情况下ruby使用utf-8编码,因此每个ansi字符长度为8位。所以密钥字符串必须是32个字节。
  2. 明确使用aes模式(例如aes-256-cbc)。
  3. 在两侧设置相同的iv(初始向量)
  4. 我终于成功完成了上述方法。 这是我的代码: Ruby方面:

    require 'openssl'
    require 'base64'
    cipher = OpenSSL::Cipher.new('aes-256-cbc')
    cipher.encrypt
    cipher.iv = 'a'*16;
    cipher.key = '01234567890123456789012345678901' # should be 32 characters, 32*8=256 bits
    enc = Base64.strict_encode64(cipher.update('01234567890123456789012345678901') + cipher.final)
    puts enc
    

    Javascript方面:

    var encrypted = new Buffer(base64Data, 'base64');
    var crypto = require('crypto');
    var decipher = crypto.createDecipheriv('aes-256-cbc', '01234567890123456789012345678901', 'aaaaaaaaaaaaaaaa');
    var dec = decipher.update(encrypted);
    console.log(Buffer.concat([dec, decipher.final()]));