【问题标题】:USing Openssl to find PBKDF2WithHmacSHA1 in Android在Android中使用Openssl查找PBKDF2WithHmacSHA1
【发布时间】:2014-07-11 05:51:34
【问题描述】:

我也在我的应用程序中使用 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 重建/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm- linux-androideabi/bin/ld.exe:./obj/local/armeabi/objs/example/example.o:很有趣 操作 Java_com_example_testjni_MainActivity_someFunction:jni/example.c:25: 错误 :对“PKCS5_PBKDF2_HMAC_SHA1”的未定义引用 collect2: ld 返回 1 个退出状态 make.exe: * [obj/local/armeabi/libexample.so] 错误 1

编辑

这是我在加载库时遇到的异常:

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[DexPathList[[zip 文件”/data/app/com.ebricks 加载 stlport_shared。 cii-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.ebricks.cii-1, /system/lib]]]: findLibrary 返回 null 07-22 10:04:26.083: E/AndroidRuntime(1952): 在 java.lang.Runtime.loadLibrary(Runtime.java:355) 07-22 10:04:26.083: E/AndroidRuntime(1952): 在 java.lang.System.loadLibrary(System.java:525) 07-22 10:04:26.083: E/AndroidRuntime(1952): 在 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)

【问题讨论】:

    标签: android sqlcipher


    【解决方案1】:

    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。

    【讨论】:

    • 嗨尼克,我已经编辑了我的问题,请告诉我如何在我的 c 代码中包含 openssl?
    • 您需要静态或动态链接 OpenSSL 以使链接器完成构建。
    • 我被这个东西卡住了 5 天。我尝试过构建静态库。我无法得到它。你能告诉我如何集成简单的静态库和计算 PKCS5_PBKDF2_HMAC_SHA1 的步骤吗?
    • 或者如何直接使用android平台提供的预编译二进制文件或libcrypto.so?
    • Nick 我使用静态库来构建本地代码,它在单独的项目中运行良好。但是,当我将该项目添加到包含 sqlcipher 的项目中时,该命令运行时会崩溃。 SQLiteDatabase.loadLibs(this);我认为 sqlciper openssl 和我的之间存在冲突,我该如何解决这个问题?请在这方面帮助我。
    猜你喜欢
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2011-07-30
    • 2011-10-17
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多