使用Openssl在Android中查找PBKDF2WithHmacSHA1

时间:2014-07-11 05:51:34

标签: android sqlcipher

我也在我的应用程序中使用sqlCipher。他们使用openssl来计算PKDF2,我已经读过某个地方,openssl实现比java实现快得多,可以找到PKDF2。所以我的问题是:

  • 这是真的,openssl可以让我在android上有更好的表现吗?
  • 我可以使用sqlCipher中使用的openssl实现吗?
  • 如果是,我如何使用openssl?
  • 查找PKDF2
  • 如果否,那么我如何使用openssl查找PBKDF2WithHmacSHA1 机器人。我在网上搜索过但没有找到任何例子。

感谢尼克的建议

我已经尝试了你的建议,我可以在我的java类中使用JNI调用c函数。 现在我有一个问题。我应该如何包含openssl(或者在我的c代码中调用PKCS5_PBKDF2_HMAC_SHA1)。这是我的代码:

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define KEY_LEN      32
#define KEK_KEY_LEN  20
#define ITERATION     1

JNIEXPORT jstring JNICALL
Java_com_example_testjni_MainActivity_someFunction(JNIEnv * env, jobject obj) {
//  return 3;

    size_t i;
            unsigned char *out;
            const char pwd[] = "password";
            unsigned char salt_value[] = {'s','a','l','t'};

            out = (unsigned char *) malloc(sizeof(unsigned char) * KEK_KEY_LEN);

            printf("pass: %s\n", pwd);
            printf("ITERATION: %u\n", ITERATION);
            printf("salt: "); for(i=0;i<sizeof(salt_value);i++) { printf("%02x", salt_value[i]); } printf("\n");

            if( PKCS5_PBKDF2_HMAC_SHA1(pwd, strlen(pwd), salt_value, sizeof(salt_value), ITERATION, KEK_KEY_LEN, out) != 0 )
            {
                    printf("out: "); for(i=0;i<KEK_KEY_LEN;i++) { printf("%02x", out[i]); } printf("\n");
            }
            else
            {
                    fprintf(stderr, "PKCS5_PBKDF2_HMAC_SHA1 failed\n");
            }
return "";
}

Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := example
LOCAL_CFLAGS    := -Werror
LOCAL_SRC_FILES := example.c
LOCAL_LDLIBS    := -llog 

include $(BUILD_SHARED_LIBRARY)

当我使用ndk-build编译我的c代码时出现此错误:

C:/Users/Nauman/Downloads/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/p 重修/窗口-x86_64的/ bin中/../ LIB / GCC /臂-Linux的androideabi / 4.6 /../../../../掰 linux-androideabi / bin / ld.exe:./ obj / local / armeabi / objs / example / example.o:好玩 ction Java_com_example_testjni_MainActivity_someFunction:jni / example.c:25:error :未定义引用'PKCS5_PBKDF2_HMAC_SHA1' collect2:ld返回1退出状态 make.exe: * [obj / local / armeabi / libexample.so]错误1

修改

这是加载libs时遇到的异常:

07-22 10:04:26.083:E / AndroidRuntime(1952):致命异常:Thread-156 07-22 10:04:26.083:E / AndroidRuntime(1952):java.lang.UnsatisfiedLinkError:无法从加载器dalvik.system.PathClassLoader加载stlport_shared [DexPathList [[zip文件“/data/app/com.ebricks。 cii-1.apk“],nativeLibraryDirectories = [/ data / app-lib / com.ebricks.cii-1,/ system / lib]]]:findLibrary返回null 07-22 10:04:26.083:E / AndroidRuntime(1952):at java.lang.Runtime.loadLibrary(Runtime.java:355) 07-22 10:04:26.083:E / AndroidRuntime(1952):at java.lang.System.loadLibrary(System.java:525) 07-22 10:04:26.083:E / AndroidRuntime(1952):at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:112) 07-22 10:04:26.083:E / AndroidRuntime(1952):at net.sqlcipher.database.SQLiteDatabase.loadLibs(SQLiteDatabase.java:107)

1 个答案:

答案 0 :(得分:0)

Android的SQLCipher会静态链接OpenSSL,因此PKCS5_PBKDF2_HMAC_SHA1包含在预编译的二进制文件中。但是,如果您只需要直接调用PKCS5_PBKDF2_HMAC_SHA1,则libcrypto.so通常与所有Android平台一起分发,但是在许多平台上版本通常是不同的。要访问PKCS5_PBKDF2_HMAC_SHA1,您需要编写一个带有链接到libcrypto的Android NDK的JNI互操作库,以及一个Java包装类来加载本机库并调用JNI。作为参考,我在SQLCipher for Android here内静态链接OpenSSL。