从密码创建非对称密钥

时间:2013-03-04 14:25:50

标签: c# encryption-asymmetric

我想允许我网站上的用户创建一个非对称私有&公钥所以他们可以:

  • 将公钥上传到网站,以便我的网络应用程序可以加密 他们上传的文件
  • 下载文件并使用本地解密 应用程序和私钥

我的问题是,如果用户机器死机,那么他们很可能会丢失他们的私钥。

我的概念是用户下载的应用程序从网站上提取文件也将允许他们生成在网站上使用的密钥。

所以我的问题是,是否可以根据密码创建非对称私钥/公钥对?这将允许用户在需要时重新生成私钥。

2 个答案:

答案 0 :(得分:1)

完全按照要求做的一种方法是:

  1. 定义安全级别N,越大越安全,但此过程将越慢。
  2. 生成“salt”并将其与用户的id相关联。
  3. 由于RSA密钥生成需要安全的随机数生成器,因此从迭代N开始,使用用户的密码和与PBKDF2的salt,以生成安全的随机数据。
  4. 此过程应确定性地生成公钥/私钥RSA密钥对。但是,不这样做的原因是:

    • 这是由我和AFAIK制作的,这篇文章是第一次公开审查这个过程。
    • 我不知道PBKDF2是否真的作为安全的随机数发生器与RSA一起使用。
    • 保证PBKDF2可以生成公共/私有RSA密钥对的数据,这可能是也可能不是。
    • 在实践中,虽然这确实有效,但它需要很长时间,所需时间取决于用户的密码,这是需要考虑的用户体验和安全暴露点。

    完成您要做的事情的更好方法是:

    1. 定义安全级别N,越大越安全,但此过程将越慢。
    2. 生成“salt”并将其与用户的id相关联。
    3. 生成RSA公钥/私钥对。
    4. 根据用户的密码和盐,迭代PBKDF2 N次以创建对称密钥。
    5. 使用对称加密算法加密私钥。
    6. 将未加密的公钥和加密的私钥上传到服务器。
    7. 这更好,因为:

      • 上面列出的所有流程均为AFAIK,标准和审核。
      • 公共/私人密钥的生成(耗时)仅在设置用户帐户时发生一次。
      • 访问密钥总是在固定的时间内发生。

      这解决了您的问题:

      • 由于服务器只有加密的私钥,因此无法解密用户的数据。
      • 如果客户端计算机终止,则服务器可以重新发出私钥。

      当然有明显的警告,例如,如果用户忘记了他们的密码,他们的所有数据都被锁定,直到公众知道如何破解RSA或者十亿年的当前计算能力被用于破解密码的任务; - )(当然取决于N和密钥大小)。此外,盐对于防止词典攻击非常重要。

答案 1 :(得分:0)

您的算法的字段(例如RSA http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsaparameters.aspx)或多或少取决于您。您可以轻松地创建一个算法,从某个字符串生成D和P(计算其中的其他RSA字段)。我真的建议你不要从StackOverflow的答案中选择一个(这只会让想要获取数据的人容易尝试)。

像RSA这样的算法难以打破的原因是基于加密数据对私钥/公钥进行逆向工程的工作量。如果你引入一个“快捷方式”,比如基于密码短语的可重现生成算法,那么系统的安全性现在取决于密码短语保密的程度,而不是加密算法本身。

私钥也是如此;这就是为什么许多组织不将私钥存储在硬盘上并将其存储在受密码或某些生物识别信息保护的安全外部设备上的原因。

我建议您从密码短语中生成密钥,只需使用推荐的做法来存储和保护您的私钥。