这是一种使用公钥加密并使用私钥解密的安全方式吗?
如果没有,我需要添加什么? 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);
答案 0 :(得分:1)
它看起来很安全,但如果你想加密字符串,通常应该使用混合加密。在这种情况下,您确实应该使用AES。如果你使用AES,建议使用某种消息认证,特别是如果填充oracles可以应用。
代码中完全缺少的是一种信任公钥的方法。您在代码中生成密钥对,但这不应该经常执行。密钥管理是密码学最重要的部分之一。
此外,这个图书馆看起来像一个男人秀。即使SLaks做出了贡献,你也应该对这些项目非常警惕。例如,SJCL库中存在一些巨大漏洞,并且在RNCrypt中也发现了一些严重问题。此外,这些项目很容易在没有维护者的情况下结束。
库的文档也很稀疏。例如。我假设默认情况下generatePrivateKey()
创建了一个大小为2048的密钥对,但除了代码审查或(实际上)测试输出之外,无法检查它。我不认为它默认为512位,但只有API文档,我无法确定。