Android 应用程序中的静态信息在哪里安全保存?

2024-02-23

在我的 Android 应用程序中,我使用很少的密钥和令牌进行身份验证和初始化。我需要存储这些静态键安全地在应用程序中的某处。同时,我也需要在代码中访问它。 我知道我现在使用的 SharedPreference 和 Gradle 变量。我也尝试过密码学,但随后我还必须存储密钥以进行解密。
因此,我正在寻找任何解决方法或适当的解决方案。任何帮助将不胜感激。


你的问题

Android 应用程序中的静态信息在哪里安全保存?

无论您在何处以及如何存储它们,因为从您发布移动应用程序的那一刻起,其中的任何秘密现在都属于公共领域。

我也尝试过密码学,但随后我还必须存储密钥以进行解密。

您可以使用 Android 中的 JNI/NDK 接口将其隐藏在 C 代码中,从而使其难以通过静态分析进行逆向工程,就像我在本文中所做的那样货币转换器演示 https://github.com/approov/currency-converter-demo/tree/0.4.0/mobile-app/android/app/src/main/cpp存储库,但是如果攻击者无法以这种方式对其进行逆向工程,他将在运行时使用仪器框架来完成此操作,一种流行的框架是Frida https://www.frida.re/:

将您自己的脚本注入黑盒进程。挂钩任何函数、监视加密 API 或跟踪私有应用程序代码,无需源代码。编辑,点击保存,然后立即看到结果。全部无需编译步骤或程序重新启动。

另一种选择是尝试在运行时计算秘密密钥,但随后 Frida 将再次挂钩执行此操作的函数并从其返回值中提取秘密。

在运行时计算 HMAC 的基本代码示例可以在ShipFast 演示 https://github.com/approov/shipfast-api-protection/blob/b45b4ced2a77a4c140fa29bc09b941b8a6c534c6/app/android/kotlin/ShipFast/app/src/main/java/com/criticalblue/shipfast/api/RestAPI.kt#L240-L282 repo:

private fun calculateAPIRequestHMAC(url: URL, authHeaderValue: String): String {

        val secret = JniEnv().getHmacSecret()
        var keySpec: SecretKeySpec

        // Configure the request HMAC based on the demo stage
        when (currentDemoStage) {
            DemoStage.API_KEY_PROTECTION, DemoStage.APPROOV_APP_AUTH_PROTECTION -> {
                throw IllegalStateException("calculateAPIRequestHMAC() not used in this demo stage")
            }
            DemoStage.HMAC_STATIC_SECRET_PROTECTION -> {
                // Just use the static secret to initialise the key spec for this demo stage
                keySpec = SecretKeySpec(Base64.decode(secret, Base64.DEFAULT), "HmacSHA256")
                Log.i(TAG, "CALCULATE STATIC HMAC")
            }
            DemoStage.HMAC_DYNAMIC_SECRET_PROTECTION -> {
                Log.i(TAG, "CALCULATE DYNAMIC HMAC")
                // Obfuscate the static secret to produce a dynamic secret to initialise the key
                // spec for this demo stage
                val obfuscatedSecretData = Base64.decode(secret, Base64.DEFAULT)
                val shipFastAPIKeyData = loadShipFastAPIKey().toByteArray(Charsets.UTF_8)
                for (i in 0 until minOf(obfuscatedSecretData.size, shipFastAPIKeyData.size)) {
                    obfuscatedSecretData[i] = (obfuscatedSecretData[i].toInt() xor shipFastAPIKeyData[i].toInt()).toByte()
                }
                val obfuscatedSecret = Base64.encode(obfuscatedSecretData, Base64.DEFAULT)
                keySpec = SecretKeySpec(Base64.decode(obfuscatedSecret, Base64.DEFAULT), "HmacSHA256")
            }
        }

        Log.i(TAG, "protocol: ${url.protocol}")
        Log.i(TAG, "host: ${url.host}")
        Log.i(TAG, "path: ${url.path}")
        Log.i(TAG, "Authentication: $authHeaderValue")

        // Compute the request HMAC using the HMAC SHA-256 algorithm
        val hmac = Mac.getInstance("HmacSHA256")
        hmac.init(keySpec)
        hmac.update(url.protocol.toByteArray(Charsets.UTF_8))
        hmac.update(url.host.toByteArray(Charsets.UTF_8))
        hmac.update(url.path.toByteArray(Charsets.UTF_8))
        hmac.update(authHeaderValue.toByteArray(Charsets.UTF_8))
        return hmac.doFinal().toHex()
    }

请记住,这是一个简单的解决方案,但即使是复杂的解决方案也容易受到攻击者使用的 Frida 脚本的攻击。

深度安全

因此,我正在寻找任何解决方法或适当的解决方案。任何帮助将不胜感激。

安全性就是添加尽可能多的层,以便让攻击者花费时间来克服所有这些层,并提高攻击者所需的技能集的标准。

因此,使用 C 代码来隐藏秘密(例如解密密钥),在 Android 密钥库上存储加密的秘密将丢弃脚本孩子,但会让您容易受到知道如何使用 Frida 脚本来挂钩您的代码的攻击者的攻击。

在我的 Android 应用程序中,我使用很少的密钥和令牌进行身份验证和初始化。

如果您正在尝试保护访问 API 的密钥,那么您可以阅读我的答案 https://stackoverflow.com/questions/60559419/how-to-secure-an-api-rest-for-mobile-app-if-sniffing-requests-gives-you-the-k/60605789#60605789 to 这个问题 https://stackoverflow.com/questions/60559419/how-to-secure-an-api-rest-for-mobile-app-if-sniffing-requests-gives-you-the-k/60605789#60605789了解实施移动应用程序证明概念将使您无需存储密钥即可访问 API 服务器。出于初始化目的,我建议您将此逻辑移至后端,因为任何应用程序内的决策都可以使用检测框架进行修改/绕过

还可以考虑对所有代码库使用强大的混淆技术,这将为攻击者对您的移动应用程序进行逆向工程增加另一层难度。

您想加倍努力吗?

在回答安全问题时,我总是喜欢参考 OWASP 基金会的出色工作。

对于移动应用程序

OWASP 移动安全项目 - 十大风险 https://www.owasp.org/index.php/OWASP_Mobile_Security_Project#Top_Ten_Mobile_Risks

OWASP 移动安全项目是一个集中资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是对移动安全风险进行分类并提供开发控制以减少其影响或被利用的可能性。

OWASP - 移动安全测试指南 https://github.com/OWASP/owasp-mstg:

移动安全测试指南 (MSTG) 是移动应用安全开发、测试和逆向工程的综合手册。

For APIS

OWASP API 安全性前 10 名 https://github.com/OWASP/API-Security

OWASP API 安全项目旨在通过强调不安全 API 的潜在风险并说明如何减轻这些风险,为软件开发人员和安全评估人员提供价值。为了实现这一目标,OWASP API 安全项目将创建并维护十大 API 安全风险文档,以及创建或评估 API 时最佳实践的文档门户。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 应用程序中的静态信息在哪里安全保存? 的相关文章

  • 如何使用 WifiEnterpriseConfig 设置“使用系统证书”

    我想为我的应用程序的用户配置企业 WiFi 网络 因此 用户必须输入用户名和密码 其余的由应用程序处理 身份验证由 RADIUS 服务器 FreeRadius 3 处理 该服务器使用 LetsEncrypt 颁发的证书 因此无需导入我自己的
  • 包管理器已去世

    我收到一位安装了很多应用程序的用户发来的邮件 称当我的应用程序使用以下代码收集活动信息时 他遇到了问题 getPackageManager queryIntentActivities mAinIntent 0 完整来源在这里 https g
  • Facebook4j API:搜索

    我正在使用 Facebook4j 通过关键字获取状态 facebook4j conf ConfigurationBuilder fac new facebook4j conf ConfigurationBuilder fac setDebu
  • app-release-unsigned.apk 未签名

    我在 github 上下载了 Android 应用程序的 zip 文件 并尝试运行它 但出现一个包含此消息的对话框 app release unsigned apk is not signed Please configure the si
  • android.view.InflateException:二进制 XML 文件行 #11:膨胀类 ImageView 时出错

    我只是尝试制作一个小的 android java xml 应用程序来计算游戏的分数 它给了我这个错误 Error inflateing class ImageView 有人知道解决方案吗 我实际上搜索了 ppl 说添加这个 android
  • 如何在Android中访问现有的sqlite数据库?

    到目前为止 我们已经在 Android 中开发了在运行时创建数据库的应用程序 我们想知道如何在 Android 应用程序中访问预构建或现有的数据库 sqlite 文件 请提供详细信息 查看文档android database sqlite
  • Firebase Messaging FCM 在可配置的时间间隔内分发

    当您使用 FCM 向给定应用程序的所有设备发送推送时 这可能会导致许多用户同时打开他们的应用程序 从而导致大量服务器轮询 从而导致负载峰值 有没有一种方便的方法可以在给定的时间间隔内分发消息以进行计划推送 最后 我们找到了一种可能的方法 通
  • 将加密从 C++ (crypto++) 匹配到 C#

    我正在尝试使用 crypto 和 c 来匹配 c 上的加密方案 但似乎无法在两者上获得相同的结果 它们都对自己起作用 但不是从一个到另一个 任何帮助都会很棒 使用 Crypto 的 C 代码 std string key 012865678
  • 作为附件的 Android 设备

    我有 2 个 Android 设备 我想用 USB OTG 电缆连接它们 并在两个设备之间进行来回通信 据我了解 一台 Android 设备将充当 USB 主机 运行 4 4 的 Nexus 7 另一台 Android 设备将充当 USB
  • 合并 dex 程序类型已存在时出错:android.support.v4.os.ResultReceiver$MyResultReceiver

    合并dex时出错 以下是依赖项 ext anko version 0 10 5 support lib 1 0 0 alpha1 room lib 1 1 0 dependencies implementation org jetbrain
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • 如何使用 MotionLayout 调整 TextView 的大小

    我正在尝试创建一个CollapsingToolbar动画使用MotionLayout 我已经成功地将所有内容设置为动画 使其表现得像CollapsingToolbar具有高度的灵活性 这意味着我可以轻松创建很棒的动画 而无需编写大量代码 我
  • 将触摸事件从 NestedScrollView 传递到父视图

    我在 NestedScrollView 下方有一个 ViewPager 宽度一些顶部填充 以及 ClipToPadding false 和透明背景 如图像 我的 ViewPager 无法获取触摸事件并且无法工作 我怎么解决这个问题 我无法更
  • 如何为 flutter 绘图应用实现橡皮擦功能

    有一个关于通过 flutter 创建绘图应用程序的视频 YouTube https www youtube com watch v yyHhloFMNNA 它支持当用户点击屏幕时绘制线 点 但我找不到像 Android 本机那样擦除用户绘制
  • 使用 eval 时不会受到 XSS 威胁

    我正在制作 不是现在 但我仍然对这个感到好奇 一款使用 HTML5 和 JS 的游戏 我想要的是人们可以插入自定义脚本 但要安全 function executeCustomJS code eval code bad 当然这段代码非常糟糕
  • 通知操作而不启动新活动?

    我计划提供一个包含两个操作的提醒通知 一个用于批准登录请求 一个用于拒绝登录请求 通过单击这些操作中的任何一个 我希望向我的服务器发出 HTTP 请求 最重要的是 我不想启动新的 Activity 或根本不想将用户重定向到我的应用程序 Co
  • Android - 如何简单地拖放按钮?

    我在这里找到了一个适合初学者的教程 http androidrox wordpress com 2011 05 13 android sample app drag and drop image using touch http andro
  • Android Volley - 发布请求 - 无法在线工作

    我试图通过 Volley 发出 POST 请求 它在我的本地主机中工作得很好 但是当我将它移动到网络服务器时 响应为空 Java代码 RequestQueue queue Volley newRequestQueue this String
  • Android 版本低于 Lollipop 时出现 java.lang.NoClassDefFoundError

    我有一台运行 Android 21 的 Nexus 5 设备 我正在测试我的项目 没有任何问题 但是 如果我使用 Google API 19 在模拟器上进行测试 则会显示错误java lang NoClassDefFoundError 如果
  • 应用程序关闭时单击 Firebase 通知后打开特定活动/片段

    我知道这个问题似乎重复 但根据我的要求 我在网上搜索了很多帖子 但没有任何对我有用 我的要求 我正在使用 Firebase 来获取推送通知 当应用程序打开时意味着一切正常 但我的问题是 如果有任何推送通知出现 应用程序处于后台 关闭意味着我

随机推荐

  • 跨页面存储信用卡信息的安全方法 ASP.NET MVC

    我正在运行 ASP NET MVC 需要一种安全的方式来临时存储信用卡数据 我有一个订单确认页面 该页面会发布到实际处理订单的操作 我尝试了 TempData 但它无法在帖子中幸存下来 由于会话存储在服务器上 我可以安全地使用它吗 Than
  • 使用 PHP unlink() 方法后获取 0KB 文件

    我正在尝试删除服务器上的文件 下面是我使用的代码 function ServerDel file file realpath file echo file fh fopen file w or die can t open file fcl
  • android: 库模块中的 fcm

    我在将 Firebase Cloud Messaging 集成到库模块中时面临一个奇怪的问题 我正在开发一个图书馆项目 在该项目中我需要处理来自图书馆本身的 FCM 服务器的通知 我不知道这是否可能 我遵循的步骤 我在 Firebase 控
  • Angular 的多种布局

    我正在构建一个 Angular 应用程序 但在如何处理主页方面遇到了一些障碍 主页有 90 的不同 只有标题保持不变 在那里我有显示用户登录状态的指令 为了利用路由 模板等 我理想地希望将我的 ngview 显示在示例的白色区域中 一切正常
  • 使用 git 管理 virtualenv 状态:这会导致问题吗?

    我目前已经以一种完全正确的方式设置了 git 和 virtualenv 满足我的需求 到目前为止 还没有造成任何问题 不过我知道 我的设置是非标准的 我想知道是否有人更熟悉 virtualenv 内部结构可以指出是否以及哪里可能出错 My
  • 从浏览器中删除历史点

    我们可以删除在网络浏览器中创建的历史记录点吗 或者当示例链接 某些链接 时是否可以不添加历史点 被点击并且浏览器中的 url 发生变化 您无法从浏览器历史记录中删除项目 但可以将新文档加载到窗口中并bypassjavascript 的历史
  • HNS 失败并出现错误:参数不正确

    我正在使用 Visual Studio 2017 制作一个 Docker 容器化应用程序 当首先通过 Visual Studio 运行 docker 时 出现错误 ERROR client version 1 22 is too old 通
  • 由于组合框未突出显示,如何“获取”WPF 组合框 PART_EditableTextbox?

    每次单击按钮时 我的 WPF 组合框都会填充一组不同的字符串 窗口上还有其他控件 组合框是窗口中的 第一个 顶部 但文本不会突出显示 当用户通过控件切换时 文本会突出显示 但当它是窗口上的第一个时 文本不会突出显示 也许我需要在组合框本身
  • Python:使用自定义分隔符格式化字符串[重复]

    这个问题在这里已经有答案了 EDITED 我必须使用字典中的值格式化字符串 但该字符串已经包含大括号 例如 raw string DATABASE name DB NAME 但是当然 raw string format my diction
  • 在 Active Directory 中,什么是资源?

    在 AAD node js 库的示例和测试中 00000002 0000 0000 c000 000000000000始终作为资源传递 什么是00000002 0000 0000 c000 000000000000 The 文档 https
  • 函数中的空参数不为 Null

    鉴于这个基本功能 Function TestFunction Param int Par1 string Par2 string Par3 If Par1 ne Null Write Output Par1 Par1 If Par2 ne
  • Scala 检查元素是否存在于列表中

    我需要检查列表中是否存在字符串 并调用相应接受布尔值的函数 是否可以通过一个衬垫来实现这一目标 下面的代码是我能得到的最好的 val strings List a b c val myString a strings find x gt x
  • 从Python中的文本文件中删除二进制数据

    我有一个包含一些二进制数据的文本文件 当我使用 Python 3 在文本模式下读取文件时 我收到一个 UniCodeDecodeError 编解码器无法解码字节 其中包含以下代码行 fo open myfile txt r for line
  • Yii2:scenario()模型方法

    有2个需要的功能 注册时设置密码和如果用户忘记密码则更改密码 用户注册时 密码长度必须至少为4个字符 当更改通过时 至少 5 个字符 视图对于注册和更改通行证很常见 显然 还存在两种操作 其中使用 注册 或 更改 场景 模型中的代码片段 p
  • android:以编程方式选择默认启动器

    我想弹出一个对话框 让用户选择要启动的启动器设置为默认选项 我试过 Intent home new Intent Intent ACTION DEFAULT home addCategory Intent CATEGORY LAUNCHER
  • nuget中的所有软件包都有免费使用许可证吗?

    我正在做一个需要操作 Excel 文件的项目 我找到了一个适合这项工作的库 名为 Aspose cells 它不是一个免费的库 我们应该从其网站购买其许可证才能在我们的项目中使用它 然而我发现这个库有一个nuget包 所以我有点困惑 想问以
  • 添加 .resx 文件时 WPF .net Core 3.0 编译错误

    以下工作按预期进行 VS Studio 2019 经过专业人士和社区的测试 创建新的 APF 应用程序 NET Framework 打开属性文件夹 将 Resources resx 更改为公共 创建一个新的资源文件 Resources de
  • cabal-install 配置文件的文档

    The cabal config存储 cabal install 使用的配置 我想对它进行一些黑客攻击 具体来说 安装了多个 GHC 版本 我希望有单独的文档索引 但是 除了默认文件中包含的内容之外 我找不到任何有关其语法或变量的文档 有可
  • 在运行 Kestrel 服务器时构建 .NET Core 应用程序

    在经典的 NET 应用程序中 我会设置本地 IIS 来运行指定的应用程序 我可以构建应用程序并点击端点以立即查看更改 我不需要每次都启动调试器 我想通过使用 Kestrel 服务器的 NET core 来实现这一点 我可以通过运行来运行我的
  • Android 应用程序中的静态信息在哪里安全保存?

    在我的 Android 应用程序中 我使用很少的密钥和令牌进行身份验证和初始化 我需要存储这些静态键安全地在应用程序中的某处 同时 我也需要在代码中访问它 我知道我现在使用的 SharedPreference 和 Gradle 变量 我也尝