【问题标题】:How to secure string in Android Application?如何保护 Android 应用程序中的字符串?
【发布时间】:2013-05-22 23:05:55
【问题描述】:

如何在 Android 应用程序中保护字符串?

选项:

  1. ProGuard: 它不保护字符串? Does proguard work to obfuscate static string constants?

  2. 加密字符串: 用于加密我需要将加密密钥(字符串)存储在某个地方,这也是同样的问题,如何保护加密密钥。

  3. 从网络服务获取字符串:但是这个解决方案对我不起作用,因为应用程序没有互联网要求/访问,这是要求/业务决策。

    李>
  4. NDK: 编写包含字符串的 c 文件并使用 JNI 返回,但我发现 Hex-Ray 反编译以反编译 *.so 文件 https://www.hex-rays.com/index.shtml

================================================ =

C 中的函数

jstring Java_com_abc_xyz_getString(JNIEnv* env, jobject javaThis) {
  return (*env)->NewStringUTF(env, "Hello String");
}

======================================

请建议在 Android SDK/NDK 中保护字符串的最佳选项。

【问题讨论】:

  • 简短的故事是,您只能使获取字符串变得困难 - 您不能让它变得不可能,因为您使用的任何加密方案都会在设备上存储一个密钥。这里有很多关于如何混淆的讨论,但确实晦涩不是安全。您必须使回答“付出的努力是否值得”这个问题变得足够困难?如果您希望某些东西完全安全,请不要将其存储在手机上。
  • 什么样的字符串?密码?出于什么目的?最适合您的解决方案将取决于您打算用它做什么。
  • @Simon :我同意你的观点,我已经尝试使用 NDK 让它变得困难,但是使用像反编译器这样的十六进制射线,任何开发人员都可以反编译 *.so 文件并获取数据,所以知道我如何使其更难反编译,
  • @Yoann : 我想存储很多东西,包括加密密钥、密码等......

标签: android security android-ndk


【解决方案1】:

密钥保护和分配是密码学中的一个大漏洞。它必须在您需要解密数据时可用。

因此,如果您的字符串是由使用设备的人输入的,您可以使用设备序列号/IMEI#/etc 作为密钥。有点安全,但逆向工程并不难。这将允许在无需用户输入密码的情况下在本地解密数据,但不允许以加密方式分发数据。

如果您尝试使用应用程序分发加密数据,正如您所发现的,密钥必须是设备本地的某个人。没有与外界的通信链接,唯一的选择是在设备中或与应用程序用户。

如果您能给我们提供预期的工作流程,您可能会得到更多有用的建议?

【讨论】:

    【解决方案2】:

    对于字符串加密,我们创建了一个 gradle 插件,以使用 NDK 和 XOR 运算符将您的密钥隐藏在您的 Android 应用程序中。目标是混淆您的密钥以防止对您的应用进行逆向工程。

    您可以选择提供自定义编码/解码算法来提高密钥的安全性。

    访问插件和所有详细信息:https://github.com/klaxit/hidden-secrets-gradle-plugin

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 2011-05-16
      • 2020-07-15
      相关资源
      最近更新 更多