求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
openssl移植Android使用及其相关经验
 

发布于2011-08-10

 

1. linux安装openssl库

参见《精通PKI网络安全认证技术与编程实现》2.3.2节 Linux下搭建OpenSSL开发环境

Linux下面解压tar.bz2文件:tar jxvf android-ndk-r5c-linux-x86.tar.bz2

2. 配置NDK的环境变量

在~/.bashrc文件末尾添加:

NDK=~/android-ndk-r4b

export NDK

执行source ~/.bashrc

如果有终端已经运行,需要在重启终端才能使用NDK变量

3. JNI介绍

JNI主要功能就是能够调用到C库,在这里我们需要用C或C++调用openssl库实现加密签名等功能,然后编译成arm体系的so库,用java调用提供的接口。

详细介绍参见此书:《TheJava Native Interface: Programmer’s Guide and Specification》

4. 下载android版本的openssl,编译

现在网上我看见过3种版本的android-openssl,fries版本,eighthave版本以及guardianproject版本,前面两个版本有测试过但是没有尝试成功,guardianproject版本编译成静态库再给android的JNI动态库程序调用的话会找不到方法,不清楚是什么原因,但是直接将JNI程序与openssl工程一起编译就可以实现。

下面这个blog有说编译openssl静态库给android用,但是不知道他用的是什么版本的Openssl,我按照他的方法尝试没有成功。

http://blog.csdn.net/someonea/article/details/6312213

guardianproject版本原版下载地址:

https://github.com/guardianproject/openssl-android

我修改过的版本:

http://download.csdn.net/source/3408214

在我修改过的版本中可以直接在myAPP文件夹下编写JNI程序,与Openssl一起打包编译成动态库就行了。

编译时可能出现一些undefined reference,大部分可能是没有添加链接库,有些情况也可能是NDK版本问题,最好用最新版本的NDK(我用的r5c),注意有没添加以下两个静态库

LOCAL_LDLIBS := -lz –ldl

5. 将编译完的so库放置android工程目录的libs/armeabi目录下

6. JAVA调用动态库

下面是本人测试时写的一个两数相加的:

Java code

native方法:

public native int add(int a,int b);

load库:

static {

System.loadLibrary("add");//编译完的都是带Lib开头的,这里Load不要加
}

7. 在c程序中调用android的log,记录运行信息

表示完全不会用gdb调试这玩意,只好用log一步步记录了…..

view plainprint?

C/C++ code

#include<android/log.h>

#define LOG_TAG"show infomation" //这个是log标签,内容自己设置

#define LOGW(a) __android_log_write(ANDROID_LOG_WARN,LOG_TAG,a) //除了这个方法还有__android_log_print方法,跟printf很像,具体可以看android/log.h里面

Makefile中LOCAL_LDLIBS:= -L$(SYSROOT)/usr/lib –llog

8. bouncyCastle结合openssl进行密钥管理

参见这个博客的介绍

http://blog.csdn.net/zhenyongyuan123/article/details/5558562

本人已经尝试成功用bouncyCastle在android上生成密钥库和密钥对,

这里需要注意的是Android上本身有bouncyCastle包,如果直接导入包会在运行时报找不到类等错误

我们需要下载bouncyCastle源码,修改包名比如org.bouncyCastle2等,编译打包成jar

Build Path->Add External Archives添加包,不然运行时也会报找不到类错误,这个可能是因为没有将jar包打入apk中。

9. openssl与cryptoAPI对称加密的兼容问题

cryptoAPI本身不支持传明文密钥进去,需要通过genKey或者DeriveKey得到Key句柄,

而这里面不仅仅只是对传进去的密钥进行hash算法,具体可参见MSDN

http://msdn.microsoft.com/en-us/library/aa379916%28v=VS.85%29.aspx

Remarks里面的

If the hash is not a member of the SHA-2 family and therequired key is for either 3DES or AES, the key is derived as follows:下面六个步骤。

我们可以通过公钥加密,私钥解密查看到cryptoAPI进行对称加密的会话密钥,这里已经有完整的代码:

http://www.codeproject.com/KB/security/plaintextsessionkey.aspx

在使用openssl的evp封装好的对称加密时貌似有点问题,可能是我使用错了,使用下面这种方式可以与cryptoAPI的加密匹配上

http://blog.csdn.net/lyjinger/article/details/1722570

10. 有些时候可能只需要NDK编译出静态库,但是如果不加上动态库会什么都不编译

这里只编译静态库需要在JNI下面建立一个Application.mk,需要在该文件中加上一句:

APP_MODULES := libexample(模块名称)

11. 另外,Android上面有一个证书安装的功能,没有真机,不了解什么用途

在android模拟器的setting里面可以找到Location&security栏,里面可以install from SD card安装加密的证书,p12格式的,带私钥的。安装后可以在Data/misc/keystore找到对应的证书,密钥等文件,代码操作没有权限。

System/etc/security下面存在cacerts.bks,BouncyCastle密钥库,读取时提示完整性检查失败,这个文件也应该是没有权限访问的


相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程
 
分享到
 
 
     


android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...