我提出了一个我不知道如何解决的问题,基本上我有这些文件可以输入“写”或“读”密码(这些密码不同),我需要加密和解密这些文件使用常见的算法,如AES。
我知道如何使用加密库(我将使用Java中提供的那些),但是,我不确定如何使其安全,或如何实现它。
我最初想过存储这些密码的盐渍哈希用于写入/读取,然后检查输入的密码,但是,我不确定Crypto如何工作,如果我有一个说Java的密钥库,则不需要密码所以密钥不以明文形式出现;我无法在任何地方以明文形式提供密钥库密码,我不允许只提出一个密码。是否有任何众所周知的解决方案可以解决我可以研究的这个问题?
基本上:无论如何都要使用从读/写密码派生的密钥来访问加密或解密依赖于输入的密码类型,即输入READ密码的用户无法加密,只需解密。
答案 0 :(得分:0)
公钥加密有两个单独的密钥,一个用于解密,另一个用于加密。通常,两者中的一个是公开的。在您的情况下,您希望将两者保密,并使用您的两个密码保护它们。我认为这对RSA有效(公钥不能从私钥中导出,在其他方案中也可以)。
所以你要创建一个RSA密钥对,并分别存储两个密钥,用两个密码保护。这样你就可以单独控制对它们的访问。
答案 1 :(得分:0)
使用RSA加密来加密和解密AES密钥。使用AES密钥加密和解密内容文件。
Java Keystore
API不支持加密公钥条目,但它确实鼓励使用密码来保护公钥的完整性。您的应用程序可以编写为使用"加密"使用" public"加载密钥库的密码加密密钥,如果输入了错误的密码则失败。当然,用户可以在应用程序之外绕过这个,并使用keytool
或他们自己的自定义代码访问公钥。但你无法阻止某人使用某些密钥执行加密;你为什么关心他们是否使用这把钥匙?
私钥条目将使用"解密"加密。密码。 Keystore
API很好地支持这种常见用例。
答案 2 :(得分:0)
如果您不允许将密钥存储在其他位置,我会将它们存储在加密文件中。我会用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”整个磁盘加密工作方式 - 使用密钥加密的磁盘,并且使用一个或多个人的密码来加密该密钥,因此这些人的密码中的任何一个可用于在启动时“解锁”磁盘。