如何在 Android 中使用自己的密钥进行 AES-256 加密?

Posted

技术标签:

【中文标题】如何在 Android 中使用自己的密钥进行 AES-256 加密?【英文标题】:How can I use my own key for AES-256 Encryption in Android? 【发布时间】:2021-11-02 07:05:02 【问题描述】:

我正在尝试用 java 开发一个需要加密的 android 应用程序。我也想使用 AES-256 进行加密。但是当我看它的教程时,它总是会生成一个随机密钥。我的问题是:如果我用随机密钥加密字符串,如何解密它?此外,我几乎尝试了 web 中的所有代码,但没有一个有效,所以你能提供一个没有盐和 IV 的 AES-256 加密代码。如果我知道错了,请纠正我并教我真相。

详细信息:我正在尝试制作密码管理器应用程序。 App有两个密码,第一个是我们用于加密字符串数据的主密码。第二个是我们要管理的密码。主密码存储在用户心中。其他密码将以加密版本存储在应用程序中。当用户想要查看他的密码时,他将输入他的主密钥来解密加密的密码。那么我该怎么做呢?用户的主密码将是 32 位或 64 位,我认为我们不需要生成随机密钥。你能告诉我一些方法吗?我不是以英语为母语的人,抱歉我的英语不好。感谢您的帮助。

【问题讨论】:

如果您没有在设备上存储加密密钥,我建议您搜索“PBKDF2”或“ARGON2i”——这些是接受用户输入(“密码短语”)的密钥派生函数并为您生成加密密钥。 但不会每次都生成随机密钥吧? 对。例如PBKDF2 您需要在您的应用程序第一次启动时生成一个 RANDOM salt,以供以后使用您需要读取此 salt(无需隐藏 salt)并将其用作以下密钥派生的输入。 谢谢兄弟。你帮了我很多。 @MichaelFehr 我有一个问题。如果我不生成和嵌入盐,它会安全吗?我想使用 PBKDF2 和 AES 128 或 256 进行加密。 【参考方案1】:

我的问题是:如果我用随机密钥加密字符串,如何解密它?

你不能。您需要保存密钥(某处)。然后,当您想要解密文件时,您恢复用于加密文件并使用它来解密的密钥。

这是一个解释如何将 AES 密钥保存到文件并恢复它的答案:https://***.com/a/7176483/139985。请注意,该示例在将密钥写入磁盘之前将其编码为十六进制。

但是。任何需要在文件系统的文件中存储加密密钥(明文)的东西都是易受攻击的。如果某人或某物可能危及保存密钥的操作系统/文件系统的安全性,他们可以读取包含密钥的文件...并...解密用于保护密钥的任何内容。

一个更好的主意是使用某种安全的密钥库/保险库。

我的建议:如果您正在编写一个为他人管理密码的应用程序,那么您真的非常需要深入了解如何安全地执行此操作。如果您不这样做,请聘请合格的 IT 安全专业人员为您设计和实施系统的这方面。

只是阅读一些教程并在 *** 上提问并不能解决问题!

【讨论】:

你好。我想使用用户输入的 32 位或 64 位数字密钥来加密字符串数据,所以我不会在应用程序中存储加密密钥。我怎样才能做到? Cemal:请重新阅读我回答的最后两段。谢谢。 (如果您不明白,请找人为您翻译我的答案。) 兄弟,你不明白我的意思。我不会将加密密钥存储在文件中。它将存储在用户的脑海中,而不是其他任何地方。所以我想了解如何制作一个程序,当用户输入他的 64 位密钥时,他将解密加密的密码。我怎样才能做到这一点。 嗯......坦率地说,我确实看到用户如何记住 256 位 AES 密钥。我仍然认为您需要与专业人士交谈......他们可以就如何设计真正安全的安全解决方案为您提供建议。但是如果您想忽略这一点,我链接到的答案中有足够的详细信息可以为您提供所需的答案。 (我假设您有一种方法可以让用户从他们的“记忆”中提供密钥。使用它而不是读取文件。) 不要考虑用户如何记住 256 位密钥。告诉我怎么做。

以上是关于如何在 Android 中使用自己的密钥进行 AES-256 加密?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中存储硬编码的加密主密钥?

如何在 Phonegap 构建中恢复 Android 密钥文件?

如何在 Android 应用程序中隐藏 API 密钥? [复制]

如何导出 Android 签名密钥

如何在 android studio 中检索签名 APK 的密钥别名和密钥密码(从 Eclipse 迁移)

在目标 c 中,如何使用 md5 作为密钥进行 AES256 加密?