Android NDK JNI 入門筆記-day04-NDK實現Hash算法

Android NDK JNI 入門筆記目錄 html

開頭

前面的學習,咱們已經掌握了 NDK 開發的必備知識。java

下一步就要多實踐,經過創造問題並解決問題,來增長熟練度,提高經驗。android

平常開發中,常常會用到 MD5 SHA1 SHA256 等 HASH 算法,咱們能夠在 Native 實現這些功能。c++

Hash 算法

HASH 主要用於信息安全領域中加密算法,他把一些不一樣長度的信息轉化成雜亂的 128 位的編碼裏,叫作 HASH 值。也能夠說,hash 就是找到一種數據內容和數據存放地址之間的映射關係。

Android 開發中,查看證書指紋:git

android-cert-fingerprint

動手實踐

像以前同樣建立一個 Native C++ 模板項目github

項目準備

day04-example-preview

選用 C++ 開源 HASH 算法實現庫

Portable C++ hashing library

cpp-hash-library

Android 工程引入 C++ 庫源碼

android-use-cpp-library-source

CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

# 該命令會查找指定目錄下的全部源文件,而後將結果存進指定變量名
aux_source_directory(hash-library HASH_LIBRARY_SRC)
# 添加頭文件搜索目錄
include_directories(hash-library)

add_library(
             native-lib

             SHARED
             
             # 將 hash-library 源文件添加進來
             native-lib.cpp ${HASH_LIBRARY_SRC})

find_library(
              log-lib
              log )

target_link_libraries( 
                       native-lib
                       ${log-lib} )

實現功能

MD5

Java 版本:
public static String md5(String plainText) {
    try {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        byte[] md5Byte = md5.digest(plainText.getBytes());
        return byteArrayToString(md5Byte);
    } catch (Exception e) {
        return "";
    }
}
Native 版本:
extern "C"
JNIEXPORT jstring JNICALL
Java_com_ihubin_ndkjni_NativeUtil_md5(JNIEnv *env, jclass clazz, jstring plaintext) {
    const char * plaintextChar = env->GetStringUTFChars(plaintext, 0);
    std::string plaintextStr = std::string(plaintextChar);
    
    MD5 md5;
    std::string md5String = md5(plaintextStr);
    char * tabStr = new char [md5String.length()+1];
    strcpy(tabStr, md5String.c_str());
    
    char md5Result[128] = {0};
    formatSignature(tabStr, md5Result);
    return env->NewStringUTF(md5Result);
}

SHA1

Java 版本:
public static String sha1(String plainText) {
    try {
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        byte[] sha1Byte = sha1.digest(plainText.getBytes());
        return byteArrayToString(sha1Byte);
    } catch (Exception e) {
        return "";
    }
}
Native 版本:
extern "C"
JNIEXPORT jstring JNICALL
Java_com_ihubin_ndkjni_NativeUtil_sha1(JNIEnv *env, jclass clazz, jstring plaintext) {
    const char * plaintextChar = env->GetStringUTFChars(plaintext, 0);
    std::string plaintextStr = std::string(plaintextChar);
    
    SHA1 sha1;
    std::string sha1String = sha1(plaintextStr);
    char * tabStr = new char [sha1String.length()+1];
    strcpy(tabStr, sha1String.c_str());
    
    char sha1Result[128] = {0};
    formatSignature(tabStr, sha1Result);
    return env->NewStringUTF(sha1Result);
}

SHA256

Java 版本:
public static String sha256(String plainText) {
    try {
        MessageDigest sha256 = MessageDigest.getInstance("SHA256");
        byte[] sha256Byte = sha256.digest(plainText.getBytes());
        return byteArrayToString(sha256Byte);
    } catch (Exception e) {
        return "";
    }
}
Native 版本:
extern "C"
JNIEXPORT jstring JNICALL
Java_com_ihubin_ndkjni_NativeUtil_sha256(JNIEnv *env, jclass clazz, jstring plaintext) {
    const char * plaintextChar = env->GetStringUTFChars(plaintext, 0);
    std::string plaintextStr = std::string(plaintextChar);
    
    SHA256 sha256;
    std::string sha256String = sha256(plaintextStr);
    char * tabStr = new char [sha256String.length()+1];
    strcpy(tabStr, sha256String.c_str());
    
    char sha256Result[128] = {0};
    formatSignature(tabStr, sha256Result);
    return env->NewStringUTF(sha256Result);
}

最終效果

day04-example-result

至此,咱們已經學會了在 Android 項目中引用開源 C++ 庫,同時咱們也實如今 Native 實現 HASH 算法。

代碼:算法

NDKJNIday04安全

參考資料:oracle

Oracle - JNI Types and Data Structureside

C++ hash-library

CMake入門

相關文章
相關標籤/搜索