从密码短语创建非对称密钥

本文关键字:非对称 密钥 创建 短语 密码 | 更新日期: 2023-09-27 18:02:12

我想让用户在我的网站上创建一个不对称的私人&这样他们就可以:

  • 上传公钥到站点,以便我的web应用程序可以加密上传的文件
  • 下载文件并使用本地加密应用程序和私钥

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

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

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

从密码短语创建非对称密钥

满足要求的一种方法是:

  1. 定义一个安全级别N, N越大越安全,但进程越慢。
  2. 生成"salt"并将其与用户id关联。
  3. 由于RSA密钥生成需要一个安全的随机数生成器,使用用户的密码和盐与PBKDF2,从迭代N开始,生成安全的随机数据。

这个过程应该确定地生成一个公钥/私钥对。但是,不这样做的原因是:

  • 这是我编造出来的,我敢说,这篇文章是第一次公开审查这个过程。
  • 我不知道PBKDF2是否实际上作为RSA使用的安全随机数生成器。
  • PBKDF2被保证生成的数据可能是真的,也可能不是真的,而公钥/私钥对将从这个数据中产生。
  • 在实践中,虽然这确实有效,但需要很长时间,并且需要的时间取决于用户的密码,这是需要考虑的用户体验和安全暴露点。

完成你正在做的事情的一个更好的方法是:

  1. 定义一个安全级别N, N越大越安全,但进程越慢。
  2. 生成"salt"并将其与用户id关联。
  3. 生成RSA公私钥对
  4. 迭代PBKDF2 N次,根据用户的密码和盐创建对称密钥。
  5. 使用对称加密算法加密私钥。
  6. 上传未加密的公钥和加密的私钥到服务器

这个更好,因为:

  • 上述所有流程均经过AFAIK、标准和审核。
  • 公钥/私钥生成(耗时)只在设置用户帐户时发生一次。
  • 访问键总是在固定时间内发生。

这个解决了你的问题:

  • 由于服务器只有加密私钥,因此无法解密用户数据。
  • 如果客户端机器死亡,服务器可以重新颁发私钥。

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

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

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

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

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