【问题标题】:Node.js and crypto libraryNode.js 和加密库
【发布时间】:2010-12-21 07:38:42
【问题描述】:

我在使用 Node 的加密库时遇到了奇怪的问题。我写了这个简单的 AES 测试脚本:

var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8')
var text = "123|123123123123123";
cipher.update(text,'utf8','hex')
var crypted = cipher.final('hex')
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8')
decipher.update(crypted,'hex','utf8')
var dec = decipher.final('utf8')

当我执行 console.log(dec) 时,它为空。出于某种原因,如果我将测试设置为“123|123123”,它就可以工作。那么为什么“123|123123”有效而“123|123123123123123”无效呢?

【问题讨论】:

  • 文本的最后工作长度似乎是 15 个字符。

标签: node.js encryption aes node-crypto


【解决方案1】:

您需要存储 cipher.update 和 cipher.final 的返回值,以确保您拥有一切。

cipher.update "返回加密的内容,并且可以在流式传输时使用新数据多次调用":

http://nodejs.org/docs/v0.2.5/api.html#cipher-update-247

cipher.final "返回任何剩余的加密内容"。

我认为您只需像这样在每次调用中附加结果:

var crypto = require('crypto');
var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8');
var text = "123|123123123123123";
var crypted = cipher.update(text,'utf8','hex');
crypted += cipher.final('hex');
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8');
var dec = decipher.update(crypted,'hex','utf8');
dec += decipher.final('utf8');

我得到 '12443a347e8e5b46caba9f7afc93d71287fbf11169e8556c6bb9c51760d5c585' 用于加密和 '123|123123123123123' 用于以上节点 v0.2.5 的 dec

【讨论】:

  • RandomEtc 是正确的,请记住,在 node.js 中,一切都针对流进行了简化。 hash 和 cipher 函数可以用文本进行多次更新,这只是向其中添加文本,但要获得结果,您必须执行 hash.digest 或 cipher.final
  • RandomEtc,感谢您对此的回答。它终于让我了解了加密货币的东西! :)
  • @RandomEtc。你能帮我把这段代码转换成javascript吗?
  • 密码密码 = Cipher.getInstance(ALGORITHM); byte[] messageArr = message.getBytes(); SecretKeySpec keySpec = new SecretKeySpec(Base64.getDecoder().decode(key), "AES");字节[] ivParams = 新字节[16];字节[] 编码 = 新字节[messageArr.length + 16]; System.arraycopy(ivParams, 0, 编码, 0, 16); System.arraycopy(messageArr, 0, 编码, 16, messageArr.length); cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(ivParams));
  • byte[] encryptedBytes = cipher.doFinal(encoded); encryptedBytes = Base64.getEncoder().encode(encryptedBytes);返回新字符串(加密字节);
【解决方案2】:

RandomEtc 是正确的,但以防万一遇到这个问题的人使用'base64' 作为他们的编码:不要。坚持'hex'。至少从 0.4.2 开始,当使用 'base64' 时,存在一个可能导致数据损坏的错误。见:https://github.com/joyent/node/issues/738/

【讨论】:

    【解决方案3】:

    请注意,+= 运算符将在更高版本的 node.js 中不起作用。请遵循Node.js Crypto class returning different results with updated version 中给出的建议并使用Buffer.concat()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      相关资源
      最近更新 更多