android so 文件存私密数据,且防止 so文件未知应用盗用

有时候我们需要在客户端 存放一些 保密的数据,比如 服务端的IP 端口,接口的地址,授权的key 等等,如果我们直接写在java中,别人反编译就能看到,那么我们可以把这些数据 存在  so文件中,这样别人就不可能会看到了,顺便 so里面验证 app的签名 来防止别人盗用so文件,

下面的例子是 在so里面获取我的客户端key

1.jni的java文件   JNI.java

[java] view plain copy
  1. package com.android.jni;
  2. import android.content.Context;
  3. public class JNI {
  4. static{
  5. System.loadLibrary("auth");
  6. }
  7. /**
  8. * 获取api 调用授权 key
  9. * @param signature 应用签名信息,防止http 接口  授权 key 被盗用
  10. * @return
  11. */
  12. public native String getAuthKey(Context context);
  13. }
[java] view plain copy  

2. .h头文件  com_android_jni_JNI.h

[cpp] view plain copy
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class com_android_jni_JNI */
  4. #ifndef _Included_com_android_jni_JNI
  5. #define _Included_com_android_jni_JNI
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class:     com_android_jni_JNI
  11. * Method:    getAuthKey
  12. * Signature: (Landroid/content/pm/Signature;)Ljava/lang/String;
  13. */
  14. JNIEXPORT jstring JNICALL Java_com_android_jni_JNI_getAuthKey
  15. (JNIEnv *, jobject, jobject);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif

3. so的 c++实现  com_android_jni_JNI.cpp

[cpp] view plain copy  
  1. #include <jni.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <com_android_jni_JNI.h>
  5. /**
  6. * http api 授权 key ,由服务端提供
  7. */
  8. const char* AUTH_KEY = "0CC175B9C0F1B6A831C399E269772661";
  9. /**
  10. * 发布的app 签名,只有和本签名一致的app 才会返回合法的 授权 key
  11. */
  12. const char* RELEASE_SIGN ="3082030d308201f5a0030201020204163677d7300d06092a864886f70d01010b05003037310b30090603550406130255533110300e060355040a1307416e64726f6964311630140603550403130d416e64726f6964204465627567301e170d3134303131343035333835315a170d3434303130373035333835315a3037310b30090603550406130255533110300e060355040a1307416e64726f6964311630140603550403130d416e64726f696420446562756730820122300d06092a864886f70d01010105000382010f003082010a02820101008f02a948189bfa0134bdb17155061a4b62956c08881eac87b39f0a0acf1c808596100b09a16600f5567e5504f035f1deadc1dcc93fa93b930f78ac9a55ee961283458d66d3775e612e4eb5f5076bf06aeabb6e285400e89dd6e1327a52b4739a91d04d7288bc64c336b7776efe0b6341913d655943ffc9da4b8ba157a52f7790a815bf0cc693dd684209a07290b9c8d4220c8f56c00c25bee78500231213adba58b3c2c9e95951308dfab9edc4f9744fe6c99b3311b54971210db4c2e8a5d518def97535a69170827d6c14bd8a822a0d1b179a3633178db16376a9596df91c595b8cb3d3a916b0f10d029a0aad3b345a7ad54e85f2547686f612b62a010d7dd90203010001a321301f301d0603551d0e04160414f7c342dca7f916bb77312bb517105732c5e96328300d06092a864886f70d01010b0500038201010010b1bb9c29118a7eb15193ef15d40bafd4338526b200511f0e348e5c93eb9cbdf9330163cba183022572513dc7dac14cbd384c116bfc2c3d5efc9f545c3972ec8ce32908eb4e54a6940774ac569d682c188388380d60ed1904ecca4f4bf6bdcacd8be71557f1133c2fd5bcc2577fde19adef54cb91e02e635b47e6a6bfb1f46a5956259a10c61727e70cd8595fd632d4ed6c588dcb089967f164090aa89050911fd70eb1f7ccacd4d7b75c0b5ecd2bb84709b16176b9ac21f8bb25a970f65105af7939057cbf616abf5e9617f1ef87e39d16e458b278cbdc4f9ccb5d8e0c69719a5fae55bdd786b7b59c4a37a205972de1b0f3d4e8877267bad8f28ab09800f2";
  13. /**
  14. * 拿到传入的app  的 签名信息,对比合法的app 签名,防止so文件被未知应用盗用
  15. */
  16. static jclass contextClass;
  17. static jclass signatureClass;
  18. static jclass packageNameClass;
  19. static jclass packageInfoClass;
  20. JNIEXPORT jstring JNICALL Java_com_android_jni_JNI_getAuthKey(
  21. JNIEnv * env, jobject obj, jobject contextObject) {
  22. jmethodID getPackageManagerId = (env)->GetMethodID(contextClass, "getPackageManager","()Landroid/content/pm/PackageManager;");
  23. jmethodID getPackageNameId = (env)->GetMethodID(contextClass, "getPackageName","()Ljava/lang/String;");
  24. jmethodID signToStringId = (env)->GetMethodID(signatureClass, "toCharsString","()Ljava/lang/String;");
  25. jmethodID getPackageInfoId = (env)->GetMethodID(packageNameClass, "getPackageInfo","(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
  26. jobject packageManagerObject =  (env)->CallObjectMethod(contextObject, getPackageManagerId);
  27. jstring packNameString =  (jstring)(env)->CallObjectMethod(contextObject, getPackageNameId);
  28. jobject packageInfoObject = (env)->CallObjectMethod(packageManagerObject, getPackageInfoId,packNameString, 64);
  29. jfieldID signaturefieldID =(env)->GetFieldID(packageInfoClass,"signatures", "[Landroid/content/pm/Signature;");
  30. jobjectArray signatureArray = (jobjectArray)(env)->GetObjectField(packageInfoObject, signaturefieldID);
  31. jobject signatureObject =  (env)->GetObjectArrayElement(signatureArray,0);
  32. const char* signStrng =  (env)->GetStringUTFChars((jstring)(env)->CallObjectMethod(signatureObject, signToStringId),0);
  33. if(strcmp(signStrng,RELEASE_SIGN)==0)//签名一致  返回合法的 api key,否则返回错误
  34. {
  35. return (env)->NewStringUTF(AUTH_KEY);
  36. }else
  37. {
  38. return (env)->NewStringUTF("error");
  39. }
  40. }
  41. JNIEXPORT jint JNICALL JNI_OnLoad (JavaVM* vm,void* reserved){
  42. JNIEnv* env = NULL;
  43. jint result=-1;
  44. if(vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK)
  45. return result;
  46. contextClass = (jclass)env->NewGlobalRef((env)->FindClass("android/content/Context"));
  47. signatureClass = (jclass)env->NewGlobalRef((env)->FindClass("android/content/pm/Signature"));
  48. packageNameClass = (jclass)env->NewGlobalRef((env)->FindClass("android/content/pm/PackageManager"));
  49. packageInfoClass = (jclass)env->NewGlobalRef((env)->FindClass("android/content/pm/PackageInfo"));
  50. return JNI_VERSION_1_4;
  51. }

关于如何获取正式keystone签名的问题

先打一个正式的包,代码里面获取到签名,然后再log里面打印出来,copy到cpp文件里面编译so即可,下面是android里面获取签名字符串的代码

[java] view plain copy
  1. public static String getSignature(Context context)
  2. {
  3. try {
  4. /** 通过包管理器获得指定包名包含签名的包信息 **/
  5. PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
  6. /******* 通过返回的包信息获得签名数组 *******/
  7. Signature[] signatures = packageInfo.signatures;
  8. /******* 循环遍历签名数组拼接应用签名 *******/
  9. return signatures[0].toCharsString();
  10. /************** 得到应用签名 **************/
  11. } catch (NameNotFoundException e) {
  12. e.printStackTrace();
  13. }
  14. return null;
  15. }

转载于:https://www.cnblogs.com/VindyLeong/p/5363667.html

(转) android so 文件存私密数据,且防止 so文件未知应用盗用相关推荐

  1. 卧操,女性私密数据曝光,原来富婆都在广西…

    点击上方"蓝色字体",选择"设为星标" 做积极向上的前端人! 作者:好奇博士 温馨提示:曝光中国女性的私密数据,据统计听说广西富婆多,去往广西的车票不多了,请大 ...

  2. 将文件夹内多个子文件里的Excel数据合并到一个文件,保存为CSV格式

    将文件夹内多个子文件里的Excel数据合并到一个文件,保存为CSV格式 使用条件: Excel文件必须是xlsx格式,且数据结构一致,方可用以下代码. # 第一步 导入模块 import pandas ...

  3. python创建csv文件并写入-Python数据写入csv格式文件

    (只是传递,基础知识也是根基) Python读取数据,并存入Excel打开的CSV格式文件内! 这里需要用到bs4,csv,codecs,os模块. 废话不多说,直接写代码!该重要的内容都已经注释了, ...

  4. 如何将文件存放在ftp服务器,ftp如何将文件上传到服务器上

    ftp如何将文件上传到服务器上 内容精选 换一换 GaussDB(DWS)支持将存在远端服务器上的TEXT.CSV和FIXED格式的数据导入到集群中.本教程以CSV格式的数据为例进行演示.其他两种格式 ...

  5. Private Data Objects, 私密数据对象,基于TEE、智能合约和分布式账本的可信计算

    本文首发在 https://zhuanlan.zhihu.com/p/109270123 本文的主要内容来自论文:Bowman, Mic, et al. "Private data obje ...

  6. android导出txt文件格式,安卓端数据导出成txt文件

    toExport() {if (this.dataList == false) {this.$createDialog({ type:"alert", content:" ...

  7. 实战:隐藏SpringBoot中的私密数据!

    这几天公司在排查内部数据账号泄漏,原因是发现某些实习生小可爱居然连带着账号.密码将源码私传到GitHub上,导致核心数据外漏,孩子还是没挨过社会毒打,这种事的后果可大可小. 说起这个我是比较有感触的, ...

  8. 扒光葡萄游戏厅私密数据,看智能电视游戏用户在干啥?

    本文为葡萄游戏厅CEO 孙峰原创文章,友盟略有删减. 智能电视被誉为最大的一块屏,游戏是最大这块屏上除视频外大家最感兴趣的业务,被行业内称之为下一个千亿金矿.在这个领域,家电厂商热情高涨,游戏厂商试水 ...

  9. 曝光中国女性的私密数据-广西富婆多,快上车!

    作者:好奇博士

最新文章

  1. ArchLinux下LXDE的安装与设置心得
  2. github添加图片
  3. html怎么样取jsp中的路径,jsp中获得路径的两种方法和获得url路径的方法(推荐)
  4. 【模板引擎】Springboot整合ThymeleafThymeleaf基本语法
  5. 吐槽express 中间件multer
  6. 查看Linux系统版本的几种方法
  7. 【bzoj2423】最长公共子序列[HAOI2010](dp)
  8. 基于DOM的Web信息提取方法
  9. suse系统关闭防火墙
  10. 做游戏,学编程(C语言) 8 英雄联盟连连看
  11. java project保存_java project 导出介绍
  12. gnome-shell 扩展
  13. 安装 Redis的Python客户端redis-py
  14. 【离散数学】数理逻辑 第二章 谓词逻辑(4) 谓词逻辑的推理理论
  15. 西门子Smart 200 PLC 封装运动控制向导生成指令(脉冲)
  16. 微分几何的20-23节笔记
  17. DNA测序发展史(3):三代测序
  18. 零基础学习计算机路线,我在B站开专栏讲解了!
  19. 《断舍离(心灵篇)》-[日]山下英子
  20. pg_buffercache

热门文章

  1. LVS负载均衡群集部署之——DR模式的介绍及搭建步骤
  2. python telnetlib 协商_Python telnetlib:令人惊讶的问题
  3. js 递归查询所有的叶子结点_json树递归js查询json父子节点
  4. python的列表和元组
  5. 虚拟主机域名访问yum服务器,虚拟主机域名访问yum服务器
  6. Flink 如何实时分析 Iceberg 数据湖的 CDC 数据
  7. 有哪些大数据处理工具?
  8. 地平线:黎明时分中的云渲染技术
  9. PHP面试题:写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数(array_multisort())
  10. 零基础学Python(第三章 基础语法)