好的,我正在处理一个应用程序,我想在用户的SD卡上存储一个文件,但我想要加密文件。我研究了几个使用DES加密来加密文件和数据的网站,但我对此感到困惑。我看到的所有例子都使用这样的一行:
SecretKey key = KeyGenerator.getInstance("DES").generateKey();
我遇到的问题是我得到了加密的密钥,显然我需要相同的密钥才能解密。但它似乎是一个悖论,因为如果我将我的密钥存储在一个文件或数据库中,有人不能获得密钥并解密我的文件吗?也许我错过了一些东西,但有没有办法使用提供的密码生成密钥?如果他们必须将生成的密钥存储在其他地方,为什么有人不想使用密钥呢?
答案 0 :(得分:1)
首先,请不要使用DES。多年来它已被打破。请改用AES。
我遇到的问题是我得到了 我的密钥加密,显然我需要 解密的密钥相同。
如果使用对称加密技术,就是这样。否则请查看asimmetric encryption。
但它似乎是一个悖论,因为 如果我将我的密钥存储在文件或文件中 数据库,不能有人拿到钥匙 并解密我的文件?
是的,有人可以做到。
Maybe I am missing something, but is there a way to generate a key using a supplied pass phrase?
您不使用密码使用密钥。通常你会做以下事情:
为什么有人不想使用 密码,如果他们必须存储 在其他地方生成密钥?
可能有几个原因。例如,您可以将密钥存储在可移动设备中,只需将其连接到计算机以检索密钥,而无需输入密码。 有一个密码也有它的缺点:必须记住密码,可以猜到,如果它太长可能你会把它写下来(那就是将它存储在一个文件中就好了)
编辑:
要从密码生成密钥,请查看PBKDF2(related post)。
答案 1 :(得分:1)
我认为有两种情况:
您信任用户 - 让密钥依赖于某些输入(密码/密码)。用它加密/解密数据。
您不信任该用户 - 然后您遇到麻烦,您可能会对加密/解密算法进行模糊处理,但只要机制+密钥存储在设备上,您就会遇到此问题。
这适用于对称和非对称加密。
答案 2 :(得分:0)
是的,可以使用密码加密。
但首先,转储DES。使用AES-128。
接受来自用户的密码短语,并使用SHA-256或SHA-512生成哈希。针对AES-128将散列修剪为128位。请参阅此帖。
尽可能使用盐。
关于密码部分的存储。存储哈希而不是密码。这样可以防止攻击者生成密钥。要求用户输入强密码。不要忘记你的盐也必须非常强壮。
因此,最后,您只存储密码的哈希值。密码不会被存储,并且不会存储解密密钥(它将在运行时生成)
希望它有所帮助。