4

好的,我正在开发一个应用程序,我想在用户的 SD 卡上存储一个文件,但我希望文件加密。我研究了几个使用 DES 加密来加密文件和数据的站点,但我对某些事情感到困惑。我看到的所有示例都使用这样的一行:

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

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

4

3 回答 3

1

首先,请不要使用DES。它已经被打破了很多年。请改用AES

我遇到的问题是我得到了要加密的密钥,显然我需要相同的密钥来解密。

如果您使用对称加密技术,就是这样。否则看看非对称加密

但这似乎是一个悖论,因为如果我将密钥存储在文件或数据库中,就不能有人得到密钥并解密我的文件吗?

是的,有人可以做到。

Maybe I am missing something, but is there a way to generate a key using a supplied pass phrase?

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

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

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

可能有几个原因。例如,您可以将密钥存储在可移动设备中,并且只需将其连接到计算机即可检索密钥,而无需输入密码。拥有密码也有其缺点:必须记住密码,可以猜到,如果太长,您可能会将其写下来(这与将其存储在文件中几乎相同)

编辑:

要从密码生成密钥,请查看PBKDF2相关帖子)。

于 2011-05-15T02:03:47.433 回答
1

我认为有两种情况:

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

  2. 你不信任用户——那你就有麻烦了,你可能会混淆加密/解密算法,但是只要将机制+密钥存储在设备上,你就会有这个问题。

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

于 2011-05-15T02:05:51.317 回答
0

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

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

接受用户的密码并使用 SHA-256 或 SHA-512 生成哈希。将 AES-128 的哈希值修剪为 128 位。参考这篇文章。

Java AES 和使用我自己的密钥

尽可能使用盐。

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

因此,最后,您只存储密码的哈希值。密码不存储,解密密钥不存储(运行时生成)

希望能帮助到你。

于 2011-07-15T06:48:45.010 回答