All Projects → wxmylife → JNI_RSA_Sign

wxmylife / JNI_RSA_Sign

Licence: other
通过JNI实现验证App签名获取公钥

Programming Languages

C++
36643 projects - #6 most used programming language
java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to JNI RSA Sign

Scapix
Scapix Language Bridge
Stars: ✭ 171 (+98.84%)
Mutual labels:  jni
Easyincrementalupdate
Android差分补丁库,通过native层合并APK,实现增量更新升级,让你更新的APK更小。
Stars: ✭ 233 (+170.93%)
Mutual labels:  jni
FirebaseAuthExample
Example Sign In, Sign Up with Email, Facebook, Twitter using Firebase combine with BaseMVP (https://github.com/derohimat/android-base-mvp)
Stars: ✭ 20 (-76.74%)
Mutual labels:  sign
Xcrash
🔥 xCrash provides the Android app with the ability to capture java crash, native crash and ANR. No root permission or any system permissions are required.
Stars: ✭ 2,689 (+3026.74%)
Mutual labels:  jni
J4rs
Java for Rust
Stars: ✭ 210 (+144.19%)
Mutual labels:  jni
react-signature-canvas
A React wrapper component around signature_pad (in < 150 LoC). Unopinionated and heavily updated fork of react-signature-pad
Stars: ✭ 420 (+388.37%)
Mutual labels:  sign
Wasmer Java
☕ WebAssembly runtime for Java
Stars: ✭ 152 (+76.74%)
Mutual labels:  jni
qd-templates
基于开源新版签到框架站发布的公共har模板库,整理自用 qiandao 框架可用的各种网站和App的 Har 模板,仅供学习参考。
Stars: ✭ 77 (-10.47%)
Mutual labels:  sign
Relinker
A robust native library loader for Android.
Stars: ✭ 2,612 (+2937.21%)
Mutual labels:  jni
flask-apiSign-demo
Api签名验证样例
Stars: ✭ 28 (-67.44%)
Mutual labels:  sign
Jfasttext
Java interface for fastText
Stars: ✭ 193 (+124.42%)
Mutual labels:  jni
Inline Java
Haskell/Java interop via inline Java code in Haskell modules.
Stars: ✭ 197 (+129.07%)
Mutual labels:  jni
SignTools-CI
Sign iOS apps on demand using CI. Part of: https://github.com/SignTools/SignTools
Stars: ✭ 145 (+68.6%)
Mutual labels:  sign
Sand
Using JNI to achieve Sobel operator image edge detection使用JNI实现Sobel算子图像边缘检测,支持kotlin https://github.com/Jomes/sand
Stars: ✭ 186 (+116.28%)
Mutual labels:  jni
Jxnet
Jxnet is a Java library for capturing and sending custom network packet buffers with no copies. Jxnet wraps a native packet capture library (libpcap/winpcap/npcap) via JNI (Java Native Interface).
Stars: ✭ 26 (-69.77%)
Mutual labels:  jni
Jpegkit Android
Efficient JPEG operations for Android without the risk of an OutOfMemoryException.
Stars: ✭ 154 (+79.07%)
Mutual labels:  jni
Android Disassembler
Disassemble ANY files including .so (NDK, JNI), Windows PE(EXE, DLL, SYS, etc), linux binaries, libraries, and any other files such as pictures, audios, etc(for fun)files on Android. Capstone-based disassembler application on android. 안드로이드 NDK 공유 라이브러리, Windows 바이너리, etc,... 리버싱 앱
Stars: ✭ 250 (+190.7%)
Mutual labels:  jni
chaoxing
Make Github to help u for signing on Superstar Xuexitong every 5 minutes, base on github actions.
Stars: ✭ 58 (-32.56%)
Mutual labels:  sign
HotSalesPOS
No description or website provided.
Stars: ✭ 14 (-83.72%)
Mutual labels:  sign
crypto
Aplus Framework Crypto Library
Stars: ✭ 20 (-76.74%)
Mutual labels:  sign

Android JNI获取应用签名

一.前言:

移动端数据加密,需要将RSA加密公钥存储,考虑到安全,现将公钥存在.so文件中,为了防止有人将.so文件拷贝使用,因此在里面验证app的签名,对比签名信息,如果正确,返回正确公钥。

二.参考:

Android JNI NDK C++ so本地验证 获取应用签名

AndroidStudio 编译C/C++文件生成SO文件

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

Android JNI 获取应用签名

Android通过NDK获取Keystore签名值

三.集成:

  1. 配置ndk环境

    打开项目中Project Structure,配置ndk目录

    示例图片

  2. 配置app下的build.gradle

    示例图片

    示例图片

  3. 修改项目下gradle.properties文件

    填加如下命令:

    android.useDeprecatedNdk=true

  4. 调用c++的java类

    必须与app下的build.gradle中moduleName相同

    public class JNIUtils {
    
        static {
            System.loadLibrary("signUtil");//必须与app下的build.gradle中moduleName相同
        }
    
        public static native String getPublicKey(Object obj);
    }
    
  5. 生成class文件

    选择Build下的Make Project

    示例图片

    示例图片

  6. 生成头文件

    进入Android Studio自带的终端中:

    cd app/src/main

    示例图片

    通过如下命令生成头文件(Mac):

    javah -d jni -classpath /[项目地址]/app/build/intermediates/classes/debug [你的包名+包含native方法的类]

    示例图片

    示例图片

  7. 创建c++文件

    在jni文件夹下创建一个c++文件,名字可以取任意的

    示例图片

    实现.h文件

    
    #include <jni.h>
    #include <string.h>
    #include <stdio.h>
    #include "com_wxmylife_jni_JNIUtils.h" //导入.h头文件
    
    /**
     *这个key是和服务器之间通信的秘钥
     */
    const char* AUTH_KEY = "keyValue";
    
    /**
     * 发布的app 签名,只有和本签名一致的app 才会返回 AUTH_KEY
     * 这个RELEASE_SIGN的值是上一步用java代码获取的值
     */
    const char* RELEASE_SIGN = "308201dd30820146020101300d06092a864886f70d010105050030373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b3009060355040613025553301e170d3136313132353137343333315a170d3436313131383137343333315a30373116301406035504030c0d416e64726f69642044656275673110300e060355040a0c07416e64726f6964310b300906035504061302555330819f300d06092a864886f70d010101050003818d0030818902818100c0f7cb6d1cd3af254945c8e784545666ac707b31f754b01a772817ece6e64b58c834ff08cb142b9cf2b1f73ee324c2efa199d5aecb7453573161a538d031c59914af4bb857b3fa36d0a46dc1f03fd130df02f17b67f4731f7333c15035866cbc7a997c2deb90336f39e7191a5826311428de7b1ba8fd948a0aa457223281c0df0203010001300d06092a864886f70d0101050500038181004d8dd7463108247341244ebc4973aaf93b33f8cf9703c4d9be80a368b6f47701f66ece6cb1121014dc1c5b42c49eae86b2a4620286aba1b221ece7fd23dc7329c8486c66a51ab8f127c9adb86944957b159b7b4a5e30b716f48524d0c2c75608532c747c70aca8ffdcaa2bbdb00f6f62f37b939b377460e1a7560101d1280a65";
    
    /**
     * 发布的app 签名 的HashCode
     */
    const int RELEASE_SIGN_HASHCODE = -332752192;
    
    JNIEXPORT jstring JNICALL Java_com_wxmylife_jni_JNIUtils_getPublicKey
      (JNIEnv *env, jclass jclazz, jobject contextObject){
    
        jclass native_class = env->GetObjectClass(contextObject);
        jmethodID pm_id = env->GetMethodID(native_class, "getPackageManager", "()Landroid/content/pm/PackageManager;");
        jobject pm_obj = env->CallObjectMethod(contextObject, pm_id);
        jclass pm_clazz = env->GetObjectClass(pm_obj);
        // 得到 getPackageInfo 方法的 ID
        jmethodID package_info_id = env->GetMethodID(pm_clazz, "getPackageInfo","(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
        jclass native_classs = env->GetObjectClass(contextObject);
        jmethodID mId = env->GetMethodID(native_classs, "getPackageName", "()Ljava/lang/String;");
        jstring pkg_str = static_cast<jstring>(env->CallObjectMethod(contextObject, mId));
        // 获得应用包的信息
        jobject pi_obj = env->CallObjectMethod(pm_obj, package_info_id, pkg_str, 64);
        // 获得 PackageInfo 类
        jclass pi_clazz = env->GetObjectClass(pi_obj);
        // 获得签名数组属性的 ID
        jfieldID signatures_fieldId = env->GetFieldID(pi_clazz, "signatures", "[Landroid/content/pm/Signature;");
        jobject signatures_obj = env->GetObjectField(pi_obj, signatures_fieldId);
        jobjectArray signaturesArray = (jobjectArray)signatures_obj;
        jsize size = env->GetArrayLength(signaturesArray);
        jobject signature_obj = env->GetObjectArrayElement(signaturesArray, 0);
        jclass signature_clazz = env->GetObjectClass(signature_obj);
    
        //第一种方式--检查签名字符串的方式
        jmethodID string_id = env->GetMethodID(signature_clazz, "toCharsString", "()Ljava/lang/String;");
        jstring str = static_cast<jstring>(env->CallObjectMethod(signature_obj, string_id));
        char *c_msg = (char*)env->GetStringUTFChars(str,0);
    
        if(strcmp(c_msg,RELEASE_SIGN)==0)//签名一致  返回合法的 api key,否则返回错误
        {
            return (env)->NewStringUTF(AUTH_KEY);
        }else
        {
            return (env)->NewStringUTF("error");
        }
    
        //第二种方式--检查签名的hashCode的方式
        /*
        jmethodID int_hashcode = env->GetMethodID(signature_clazz, "hashCode", "()I");
        jint hashCode = env->CallIntMethod(signature_obj, int_hashcode);
        if(hashCode == RELEASE_SIGN_HASHCODE)
        {
            return (env)->NewStringUTF(AUTH_KEY);
        }else{
            return (env)->NewStringUTF("错误");
        }
         */
    
      }
    
  8. java相关代码

    获取App签名

    public static String getSignature(Context context)
            {
                try {
                    /** 通过包管理器获得指定包名包含签名的包信息 **/
                    PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
                    /******* 通过返回的包信息获得签名数组 *******/
                    Signature[] signatures = packageInfo.signatures;
                    /******* 循环遍历签名数组拼接应用签名 *******/
                    return signatures[0].toCharsString();
                    /************** 得到应用签名 **************/
                } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                }
                return null;
    }
    
  9. 完成效果

    成功 失败
    示例图片 示例图片
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].