You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin应用中安全存储OpenAI API Key的方案问询

JNI存储API Key的安全性分析及替代方案

一、JNI存储API Key并不安全

直接将API Key硬编码在C文件并编译为so库,并非安全的存储方式:

  • 攻击者可通过IDA Pro、Ghidra等反编译工具,轻松从so文件中提取明文形式的API Key,无混淆或加密时更是如此。
  • 即便做了简单字符串混淆,也能通过动态调试APP,在调用getApiKey()时从内存中捕获明文Key。

二、更优的API Key存储方案

1. 自定义中转服务器(最安全的业界标准方案)

完全不在客户端存储API Key,所有与OpenAI的交互通过自有服务器转发:

  • 客户端仅调用你的服务器接口,由服务器携带API Key请求OpenAI,再将响应返回给客户端。
  • 优势:彻底规避API Key暴露风险,还能在服务器层实现请求限流、内容过滤、日志审计等管控功能。

2. 结合设备标识的加密存储

若必须在客户端存储,可通过Android系统的KeyStore加密:

  • 利用KeyStore生成加密密钥,结合设备唯一标识(如Android ID哈希值)对API Key加密后,存储到SharedPreferences或本地文件。
  • 使用时先解密再发起请求,虽无法完全杜绝破解,但能大幅提升攻击者的破解成本。

3. 动态获取临时授权凭证

基于自有服务器生成临时权限凭证:

  • 客户端先向服务器请求临时凭证,服务器验证客户端合法性后,返回限时、限权限的临时密钥或Token。
  • 客户端用临时凭证请求OpenAI,过期后重新获取,降低密钥泄露后的影响范围。

三、当前代码的临时优化建议

若暂时无法搭建中转服务器,可对C文件中的API Key做简单混淆,延缓破解速度:

JNIEXPORT jstring JNICALL
Java_vvv_altug_dreamgpt_NativeLibWrapper_getApiKey(JNIEnv *env, jobject obj) {
    char part1[] = "sk-";
    char part2[] = "XXXXXXX";
    char part3[] = "keyXXXXXXX";
    char fullKey[100];
    strcpy(fullKey, part1);
    strcat(fullKey, part2);
    strcat(fullKey, part3);
    return (*env)->NewStringUTF(env, fullKey);
}

注:此方式仅为临时缓解,无法从根本上解决安全问题。

内容的提问来源于stack exchange,提问作者abdulwasey20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:46:07