【问题标题】:Writing Simple Crypto using Different Passwords for Encrypting/Decrypting使用不同的密码编写简单的加密货币以进行加密/解密
【发布时间】:2016-02-23 22:07:55
【问题描述】:

我遇到了一个我不知道如何解决的问题,基本上我有这些文件,可以输入“写入”或“读取”密码(这些密码不同),我需要加密和解密这些文件使用 AES 等通用算法。

我知道如何使用加密库(我将使用 Java 中提供的库),但是,我不确定如何确保它的安全,或者如何实现它。

我最初想存储这些密码的加盐哈希以进行写/读,然后检查输入的密码,但是,我不确定 Crypto 将如何工作,如果我有一个 Java 中的密钥库,它不需要密码,这样密钥就不会以明文形式出现;我不能在任何地方拥有明文的密钥库密码,也不能只编一个密码。我提出的这个问题有什么众所周知的解决方案可以研究吗?

本质上:是否可以使用从读/写密码派生的密钥进行加密或解密取决于输入的密码类型,即输入 READ 密码的用户无法加密,只能解密。

【问题讨论】:

  • 这只是一个课程作业之类的,我希望...
  • 是的,就是这样,我正试图根据他分配给我们的规范在我的设计中做出正面或反面

标签: java encryption


【解决方案1】:

公钥密码术有两个单独的密钥,一个用于解密,一个用于加密。但是,通常,两者之一是公开的。在您的情况下,您希望将两者保密,并使用您的两个密码保护它们。我想这适用于 RSA(公钥不能从私钥派生,而在其他方案中可以)。

因此,您将创建一个 RSA 密钥对,并分别存储两个密钥,并使用两个密码进行保护。这样您就可以单独控制对它们的访问。

【讨论】:

  • 我喜欢我在下面回答的想法,但我需要在系统中为每个用户存储一对密钥?对于仅值 10 学分模块的 1/3 * 0.2 的东西,这种设计似乎太复杂了。我可能会误解规范
【解决方案2】:

使用 RSA 加密来加密和解密 AES 密钥。使用 AES 密钥对内容文件进行加密和解密。

Java Keystore API 不支持公钥条目的加密,但它鼓励使用密码来保护公钥的完整性。您的应用程序可以编写为使用“加密”密码来加载带有“公共”加密密钥的密钥库,如果输入错误的密码则失败。当然,用户可以在应用程序之外绕过这一点,并使用类似keytool 或他们自己的自定义代码来访问公钥。但是你不能真正阻止某人使用某个密钥进行加密;你为什么关心他们是否使用这个密钥?

私钥条目将使用“解密”密码进行加密。 Keystore API 很好地支持这种常见用例。

【讨论】:

  • 我喜欢这个想法,但是如果可以接受多个密码来访问加密或解密密码呢?我需要多个密钥对才能在系统上实现每个密码的权限。
  • @Display 您可以使用多个密钥对来执行此操作,或者您可以在具有不同密码的不同私钥条目中复制 RSA 密钥,在具有不同密码的密钥库中复制公钥。但是,通常,每个用户都有一个私钥和一个密码,以保护该私钥和他们可能用于加密的任何公钥。如果一个文件需要多人读取,您可以使用每个阅读器的公钥对其 AES 密钥进行加密。
  • @显示一个密钥与另一个密钥的加密是标准的。这就是 CMS (S/MIME)、PGP 和其他常见加密系统的工作方式。没有什么“令人费解”的。您的任务中奇怪的事情是保持加密密钥私有的奇怪要求。通常,您希望能够对加密密钥进行身份验证,这样您就不会使用攻击者的密钥而不是预期的接收者来加密文件。
【解决方案3】:

如果不允许您将密钥存储在其他地方,我会将它们存储在加密文件中。我将使用 AES 加密文件,然后通过两个 AES 密钥(读取密钥和写入密钥并存储)对该密钥(“文件密钥”)进行两次加密:

[length-of-next-section] [file-key-encrypted-by-read] [length] [file-key-encrypted-by-write-key] [length] [file-data-as-encrypted-by-file-key]

FWIW,这类似于 MAC OS X 的“File Vault 2”整个磁盘加密的工作原理——磁盘使用密钥加密,并且使用 1 个或多个人的密码来加密该密钥,因此这些人的密码中的任何一个可用于在启动时“解锁”磁盘。

【讨论】:

  • 嘿,这是一个很棒的建议,但是我只缺少一件事,比如写用户加密文件,因此 [write] 部分与 [read] 部分不同-文本。因此,当 [read] 用户尝试读取文件时,他不会只是访问过时的信息(而且 [read] 不会加密任何它应该解密的东西)。有没有机会帮助我进一步理解这一点?
猜你喜欢
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 2010-09-07
  • 2013-05-12
  • 2018-12-10
  • 2016-10-15
  • 1970-01-01
  • 2020-11-10
相关资源
最近更新 更多