当前位置: 首页 > 知识库问答 >
问题:

使用Openssl在Android中查找PBKDF2WithHmacSHA1

苏波涛
2023-03-14

我还在应用程序中使用sqlCipher。他们使用openssl来计算PKDF2并且我在某处读到openssl实现比java实现更快地找到PKDF2。所以我的问题是:

  • openssl能在Android上提供更好的性能,这是真的吗?
  • 我可以使用SQLCipher中使用的openssl实现吗?
  • 如果是,如何使用OpenSSL使用find PKDF2?
  • 如果没有,那么我如何使用openssl在Android中找到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)

以下是我在加载库时遇到的例外情况:

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]]]:

共有1个答案

宋安晏
2023-03-14

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

 类似资料:
  • 我正在使用openssl检查是否存在tlsv1。3是否支持域列表。我已经编写了脚本,但脚本没有停止,它会等待我按CTRL D键,然后给我一个结果。这是scirpt 我还将echo与openssl结合使用,如下所示 注意:当我在终端上为单个站点运行命令时,我得到的结果没有键入CRTL D,但当我在脚本中使用loop和if语句时,它会等待我按下CTRL D。这真的很奇怪。 我还尝试了echo“q”|

  • 我想,我很理解函数“cv2.FindOntours(图像、模式、方法)。但我在opencv的一个文档中得到了这个东西轮廓,层次=cv2.FindOntours(thresh,2,1)。我不明白这里2,1的含义以及为什么使用它们。请有人解释一下。

  • http://www.techrepublic.com/article/four-handy-android-studio-shortcuts-for-eclipse-users/

  • 这意味着什么,我如何搜索我的字符串?

  • 问题内容: 我有以下内容…我不会说问题,而是情况。 我有一些带有标签和其他内容的HTML。我想搜索每个URL的HTML。我现在正在通过检查它说“ h”,“ t”,“ t”然后“ p”的位置来做到这一点,但是我认为这不是一个很好的解决方案 有什么好主意吗? 补充:我正在寻找某种伪代码,但是,以防万一,我正在为此项目使用Java 问题答案: 尝试使用HTML解析库,然后在HTML文档中搜索标签。 并非

  • 问题内容: 我有以下内容…我不会说问题,而是情况。 我有一些带有标签和其他内容的HTML。我想搜索每个URL的HTML。我现在正在通过检查它说“ h”,“ t”,“ t”然后“ p”的位置来做到这一点,但是我认为这不是一个很好的解决方案 有什么好主意吗? 补充:我正在寻找某种伪代码,但是,以防万一,我正在为此项目使用Java 问题答案: 尝试使用HTML解析库,然后在HTML文档中搜索标签。 并非