【问题标题】:Encrypting data with forgejs on the client side, and decrypting with ruby在客户端用forgejs加密数据,用ruby解密
【发布时间】:2015-04-30 14:58:07
【问题描述】:

对于给定的项目,我希望使用 AES 256 加密一段数据,然后 RSA 加密密钥。我一直在 ruby​​ 中使用 Forge 和 Encryptor gem,但我似乎无法获得匹配的加密值:

var key = 'strengthstrengthstrengthstrength';
var iv =  'cakecakecakecakecakecakecakecake';
var cipher = forge.aes.createEncryptionCipher(key, 'CBC');
cipher.start(iv);
cipher.update(forge.util.createBuffer("some string"));
cipher.finish();

var encrypted = cipher.output;
console.log(btoa(encrypted.data)); // outputs: CjLmWObDO2Dlwa5tJnRBRw==

然后在 IRB 中:

Encryptor.encrypt 'some string', :key => 'strengthstrengthstrengthstrength', :key => 'cakecakecakecakecakecakecakecake'
Base64.encode64 _
# outputs: C9Gtk9YfciVMJEsbhZrQTw==\n

对 Key & IV 使用字符串值,尝试过:

var key = forge.random.getBytesSync(32);
var iv = forge.random.getBytesSync(32);

然后对他们每个人进行btoa() 调用。在 ruby​​ 端使用Base64.decode64,然后将它们传递给Encryptor.decrypt,但仍然没有运气。

知道我哪里出错了吗?

【问题讨论】:

  • 您是否复制粘贴了上面的实际 Encryptor.encrypt 行?第二个 :key 应该是 :iv,不是吗?
  • IV 值太长了,应该使用 16 字节的 IV,而不是 32 个字符的 IV。

标签: javascript ruby encryption aes


【解决方案1】:

我设法让它工作。由于我只是使用一个密钥来加密一个值,因此我也只是将密钥用作 IV 和 Salt。 如果您使用密钥加密多个值,则不建议这样做。然后,您需要生成适当的盐值和 iv 值。

gen 键值也是一个很糟糕的方法,因为Math.random 不安全。只是没时间正确执行此操作,但在这种情况下可以正常工作。

var Encryption = (function () {

  var api = {
    getKey: function () {
      var possible = "ABCDEFabcdef0123456789";
      var key = '';
      for (var i = 0; i < 32; i++) {
        key += possible.charAt(Math.floor(Math.random() * possible.length));
      }
      return key;
    },

    encryptPII: function (rawKey, value) {
      var salt = rawKey;
      var iv = rawKey;
      var key = forge.pkcs5.pbkdf2(rawKey, salt, 2000, 32);
      var cipher = forge.aes.createEncryptionCipher(key, 'CBC');
      cipher.start(iv);
      cipher.update(forge.util.createBuffer(value));
      cipher.finish();

      return btoa(cipher.output.data);
    }
  };
  return api;
})();

rawKey 是从getKey() 返回的值。 value 属性是要加密的字符串。我将 rawkey 用于 iv 和 salt 值,以与 ruby​​ 中的 Encryptor gem 相同的方式生成密钥。然后使用 forge 加密字符串值。

如果我采用 base64,用 ruby​​ 对其进行解码,并将相同的 rawKey 值传递给密钥、盐和 iv 的加密器 gem,它可以工作。

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2020-03-23
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多