2

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

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

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

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

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

4

2 回答 2

1

完全按照您的要求进行操作的一种方法是:

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

此过程应确定性地生成公钥/私钥 RSA 密钥对。但是,不这样做的原因是:

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

完成您正在尝试做的事情的更好方法是:

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

这更好,因为:

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

这解决了你的问题:

  • 由于服务器只有加密的私钥,它不能解密用户的数据。
  • 如果客户端机器死了,服务器可以重新发布私钥。

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

于 2013-07-10T16:28:50.447 回答
0

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

像 RSA 这样的算法难以破解的原因是基于加密数据对私钥/公钥进行逆向工程所付出的努力。如果您引入“快捷方式”,例如基于密码的可重现生成算法,那么系统的安全性现在取决于密码的保密程度,而不是加密算法本身。

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

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

于 2013-03-04T15:38:15.017 回答