NodeJS,RSA,这样安全吗?

时间:2014-01-21 15:29:42

标签: node.js encryption cryptography rsa

这是一种使用公钥加密并使用私钥解密的安全方式吗?

如果没有,我需要添加什么? AES或类似的传递?

var ursa = require('ursa');
var fs = require('fs');

// create a pair of keys (a private key contains both keys...)
var keys = ursa.generatePrivateKey();
console.log('keys:', keys);

// reconstitute the private key from a base64 encoding
var privPem = keys.toPrivatePem('base64');
console.log('privPem:', privPem);

var priv = ursa.createPrivateKey(privPem, '', 'base64');

// make a public key, to be used for encryption
var pubPem = keys.toPublicPem('base64');
console.log('pubPem:', pubPem);

var pub = ursa.createPublicKey(pubPem, 'base64');

// encrypt, with the public key, then decrypt with the private
var data = new Buffer('hello world');
console.log('data:', data);

var enc = pub.encrypt(data);
console.log('enc:', enc);

var unenc = priv.decrypt(enc);
console.log('unenc:', unenc);

1 个答案:

答案 0 :(得分:1)

它看起来很安全,但如果你想加密字符串,通常应该使用混合加密。在这种情况下,您确实应该使用AES。如果你使用AES,建议使用某种消息认证,特别是如果填充oracles可以应用。

代码中完全缺少的是一种信任公钥的方法。您在代码中生成密钥对,但这不应该经常执行。密钥管理是密码学最重要的部分之一。

此外,这个图书馆看起来像一个男人秀。即使SLaks做出了贡献,你也应该对这些项目非常警惕。例如,SJCL库中存在一些巨大漏洞,并且在RNCrypt中也发现了一些严重问题。此外,这些项目很容易在没有维护者的情况下结束。

库的文档也很稀疏。例如。我假设默认情况下generatePrivateKey()创建了一个大小为2048的密钥,但除了代码审查或(实际上)测试输出之外,无法检查它。我不认为它默认为512位,但只有API文档,我无法确定。