对Android加密如何工作感到困惑

时间:2011-05-15 01:58:37

标签: java android encryption cryptography des

好的,我正在处理一个应用程序,我想在用户的SD卡上存储一个文件,但我想要加密文件。我研究了几个使用DES加密来加密文件和数据的网站,但我对此感到困惑。我看到的所有例子都使用这样的一行:

SecretKey key = KeyGenerator.getInstance("DES").generateKey();

我遇到的问题是我得到了加密的密钥,显然我需要相同的密钥才能解密。但它似乎是一个悖论,因为如果我将我的密钥存储在一个文件或数据库中,有人不能获得密钥并解密我的文件吗?也许我错过了一些东西,但有没有办法使用提供的密码生成密钥?如果他们必须将生成的密钥存储在其他地方,为什么有人不想使用密钥呢?

3 个答案:

答案 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?

您不使用密码使用密钥。通常你会做以下事情:

  1. 密钥生成
  2. 加密使用从密码短语派生的对称密钥生成的密钥
  3.   

    为什么有人不想使用   密码,如果他们必须存储   在其他地方生成密钥?

    可能有几个原因。例如,您可以将密钥存储在可移动设备中,只需将其连接到计算机以检索密钥,而无需输入密码。 有一个密码也有它的缺点:必须记住密码,可以猜到,如果它太长可能你会把它写下来(那就是将它存储在一个文件中就好了)

    编辑:

    要从密码生成密钥,请查看PBKDF2related post)。

答案 1 :(得分:1)

我认为有两种情况:

  1. 您信任用户 - 让密钥依赖于某些输入(密码/密码)。用它加密/解密数据。

  2. 您不信任该用户 - 然后您遇到麻烦,您可能会对加密/解密算法进行模糊处理,但只要机制+密钥存储在设备上,您就会遇到此问题。

  3. 这适用于对称和非对称加密。

答案 2 :(得分:0)

是的,可以使用密码加密。

但首先,转储DES。使用AES-128。

接受来自用户的密码短语,并使用SHA-256或SHA-512生成哈希。针对AES-128将散列修剪为128位。请参阅此帖。

Java AES and using my own Key

尽可能使用盐。

关于密码部分的存储。存储哈希而不是密码。这样可以防止攻击者生成密钥。要求用户输入强密码。不要忘记你的盐也必须非常强壮。

因此,最后,您只存储密码的哈希值。密码不会被存储,并且不会存储解密密钥(它将在运行时生成)

希望它有所帮助。