【问题标题】:Generate RSA key pair in javascript, based on a password基于密码在javascript中生成RSA密钥对
【发布时间】:2012-06-24 18:10:10
【问题描述】:

据我了解,RSA 密钥通常是基于(强)随机生成器生成的。

相反,我想根据密码创建它们。

或者更确切地说是在其哈希上,例如 sha512(sha512(password+salt)+password+pepper)

这需要在客户端用 JavaScript 完成。

有人知道怎么做吗?是否有一个简单的 JavaScript 库可以根据给定的输入确定性地创建 RSA 密钥对?

(实际上,我说的是 RSA,但任何安全的非对称加密就足够了,我只需要公私加密)


补充:我需要这个,因为我正在构建一些安全的通信解决方案,它不需要依赖连接甚至服务器来保证安全。

我正在使用随机密钥使用 AES 加密所有内容,并且这些密钥是 RSA 加密的。这个想法是 Alice 可以使用 Bob 的公钥对她的内容(或者实际上是她的内容的 AES 密钥)进行 RSA 加密(因此 Bob 的公钥必须在线存储)。

稍后,当 Bob 再次输入他的密码时,他的浏览器可以当场确定性地计算他的 RSA 私钥和公钥,从 Alice 下载内容,并使用他的私钥在本地解密。

【问题讨论】:

  • 使用 JavaScript 创建 RSA 密钥?我记得自己试过。它吞噬了我所有的记忆,并花了很长时间来计算。然后我切换到Java。
  • RSA 以外的非对称加密方案也可以。但是我需要在客户端生成密钥,并在发送之前加密数据(使用私钥)。公钥将存储在服务器端。不知道ECC方法是否更快?
  • @SheldonPinkman 加密是使用公钥而不是私钥完成的。因此你的想法是有缺陷的。
  • @Eugene:对不起,你是对的,我的意思是用公钥加密,我正在在线存储公钥+加密内容。用户实际上会使用彼此的公钥加密内容。
  • 请注意这个关于在 javascript 中进行加密的警告 -> stackoverflow.com/a/10553576/993133

标签: javascript security cryptography rsa key-generator


【解决方案1】:

RSA 密钥不只是像大多数对称算法一样的随机位,它们是从大素数派生的指数和模数。因此,我看不出有任何合理的方式可以从密码中生成它们。见this wikipedia article

您将这些密钥对用于什么目的?为什么它们必须从密码派生?如果您想使用密码来加密某些东西,您可以使用 SHA256(密码)来派生 AES256 密钥。 (如果您打算这样做,请务必阅读key strengthening)。

【讨论】:

  • 你可以用密码初始化随机发生器,这样就可以得到“依赖”密码的密钥。但通常没有实际理由这样做(我知道有一种情况是合理的:)。
  • 好吧,我想缺少 RNG 是一个很好的原因。但我感觉整个方案存在一些严重的设计缺陷。
  • @Petey:我知道 RSA 密钥不仅仅是随机位,但我可以简单地用从密码派生的东西替换随机生成器(无论它出现在现有 RSA 密钥生成器中的哪个位置)。它甚至可以是一个随机生成器,只是用密码的哈希值作为种子。这样,相同的密码将产生完全相同的 RSA 密钥。
【解决方案2】:

看起来Cryptico 可以帮助您,当您将密码作为 RNG 的种子时。

【讨论】:

    【解决方案3】:

    我无法评论我的标点符号,但除了他所说的 +Eugene_Mayevski_'EldoS

    纯 JavaScript:https://www.npmjs.com/package/cryptico

    对于 nodejs:https://www.npmjs.com/package/cryptico 你需要:

    npm install cryptico
    

    并添加这一行:

    var cryptico = require("cryptico");
    

    创建对象:

    function cryptoObj(passPhrase)
    {
       this.bits = 1024; //2048;
       this.passPhrase = passPhrase;
       this.rsaKey = cryptico.generateRSAKey(this.passPhrase,this.bits);
       this.rsaPublicKey = cryptico.publicKeyString(this.rsaKey);
    
       this.encrypt = function(message){
         var result = cryptico.encrypt(message,this.rsaPublicKey);
         return result.cipher;
       };
    
       this.decrypt = function(message){
         var result = cryptico.decrypt(message, this.rsaKey);
         return result.plaintext;
       };
    }
    
    console.log('---------------------------------------------------------');
    var localEncryptor = new cryptoObj("XXyour secret txt or number hereXX");
    
    var encryptedMessage = localEncryptor.encrypt('new message or json code here');
    var decryptedMessage = localEncryptor.decrypt(encryptedMessage);
    
    console.log('');
    console.log('>>> Encrypted Message: '+encryptedMessage);
    console.log('');
    console.log('>>> Decrypted Message: '+decryptedMessage);
    

    【讨论】:

    • 当我使用 var cryptico = require("cryptico");在我的component.ts 中出现错误----“(SystemJS)XHR 错误(404 Not Found)正在加载localhost:5555/node_modules/crypto.js”。
    【解决方案4】:

    2020 年浏览器/客户端年度答案:

    如果您想通过 TypeScript 在客户端使用 RSA 加密(例如在浏览器或带有 Ionic 的混合应用程序中),请执行以下操作:

    • npm i cryptico-js --save
    • 在您的 TypeScript (v3.4+) 代码中使用下一个导入:import * as cryptico from 'cryptico-js/dist/cryptico.browser.js';
    • 之后,您可以使用所有cryptico 方法,如下所述:https://www.npmjs.com/package/cryptico

    【讨论】:

    • 实际上我在互联网上的任何地方都不清楚如何在 Angular 应用程序中使用它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多