在Android NDK中使用OpenSSL

从 6.0 开始,Google 要求不要使用系统的 OpenSSL,请见:https://developer.android.com...。因此,请不要再使用本文介绍的方法,请自行交叉编译 OpenSSL 或者使用别人编译好的版本。
2017年3月注

由于Java较为容易被反编译,因此把一些重要代码放在so文件中成为了一个代价不太高的选择。虽然so文件依旧可以反编译,但对so进行逆向分析的门槛则要比分析Java字节码的门槛高出不少。很多安全相关的代码都依赖OpenSSL,然而网络上在NDK中使用OpenSSL的教程并不多见,经过一天的探索,我终于可以成功在NDK中调用OpenSSL了。本文将以调用OpenSSL中的HMAC算法为例,介绍如何使用Gradle配置NDK并在NDK中使用OpenSSL。

在Gradle中配置NDK

2015年7月,Google发布了新的Gradle插件,提供了对NDK的支持,从此,编写NDK程序不再需要编写Android.mk文件,也不再需要使用ndk-build脚本,只需要在Gradle中简单的配置一下,即可方便的编译程序了。

目前,新的插件仍处在beta版本,本文选用当前时间(2016年3月2日)最新的0.6.0-beta5作介绍。要获取最新的更新,请访问这里。

从传统的Android Gradle插件迁移到新的插件并不困难,只需要修改原有目录结构中的三个文件即可。以如下目录为例:

.
├── app/
│   ├── build.gradle
│   └── src/
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

需要修改的文件包括两个build.gradlegradle-wrapper.propertieslocal.properties文件。

分别来看对它们的修改:

每个版本的插件都只支持特定的Gradle版本,因此请务必对照上文给出的链接填写正确的版本。

  • ./local.properties

需要在文件中指定ndk.dir属性,指向NDK的路径。

  • ./gradle/wrapper/gradle-wrapper.properties

这个文件定义了Gradle的版本,这里需要使用gradle-2.10,因此需要把最后一行的版本替换掉。

  • ./build.gradle

这里定义了构建时使用的插件,需要替换为com.android.tools.build:gradle-experimental:0.6.0-beta5

  • ./app/build.gradle

这个文件变化较大,主要的变化包括:

  1. 插件名由原来的com.android.application变为com.android.model.application

  2. 所有的配置放置在model { }块中。

  3. minSdkVersiontargetSdkVersion都需要配置它们的apiLevel属性。

下面是一个完整的示例:

apply plugin: 'com.android.model.application'model {android {compileSdkVersion 23buildToolsVersion "23.0.2"defaultConfig {applicationId "com.example.openssltest"minSdkVersion.apiLevel 14targetSdkVersion.apiLevel 23versionCode 1versionName "1.0"}ndk {moduleName = "openssl-jni"platformVersion = 14ldFlags.add("-lcrypto")abiFilters.add("armeabi-v7a")}}
}dependencies {compile 'com.android.support:appcompat-v7:23.1.1'
}

这个配置中,多出了ndk部分,下面就来解释一下这部分的配置:

  • moduleName决定了编译出来的库的名称,这个选项是必须的。

  • platformVersion指定了NDK的platform版本,这里使用14是因为minSdkVersion使用14。

  • ldFlags指定了链接时的参数,由于本例中只用到了HMAC算法,因此这里添加了对crypto,如果还需要TLS的支持,这里需要改为ldFlags.addAll(["-lcrypto", "-lssl"])

  • abiFilters里指定了abi的版本armeabi-v7a

在NDK中使用OpenSSL

Android里已经内置了OpenSSL,但NDK中并没有提供相应的库。只需要把OpenSSL的.so文件放在NDK中即可:

$adb pull /system/lib/libssl.so /myndk/platforms/android-14/arch-arm/usr/lib$adb pull /system/lib/libcrypto.so /myndk/platforms/android-14/arch-arm/usr/lib

然后把OpenSSL的头文件放在 /myndk/platforms/android-14/arch-arm/usr/include 目录中即可。

编写代码请参考JNI的文档,下面给出一个调用HMAC-SHA256的实现:

#include <jni.h>
#include <openssl/hmac.h>#ifdef __cplusplus
extern "C" {
#endif
jbyteArray
Java_com_example_openssltest_MainActivity_hmacSha256(JNIEnv *env,jobject obj,jbyteArray content) {unsigned char key[] = {0x6B, 0x65, 0x79};unsigned int result_len;unsigned char result[EVP_MAX_MD_SIZE];// get data from java arrayjbyte *data = env->GetByteArrayElements(content, NULL);size_t dataLength = env->GetArrayLength(content);HMAC(EVP_sha256(),key, 3,(unsigned char *) data, dataLength,result, &result_len);// release the arrayenv->ReleaseByteArrayElements(content, data, JNI_ABORT);// the return valuejbyteArray return_val = env->NewByteArray(result_len);env->SetByteArrayRegion(return_val, 0, result_len, (jbyte *) result);return return_val;
}
#ifdef __cplusplus
}
#endif

在Java中调用也很容易,只需要引用build.gradle中指定的库即可:

public native byte[] hmacSha256(byte[] data);static {System.loadLibrary("openssl-jni");
}

DEMO项目链接

https://github.com/terro/andr...

需要注意的是,这里只是一个简单的DEMO,不要直接在项目中保存密钥之类的信息。



原文链接:https://dangfan.me/zh-Hans/po...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

买的情侣裤衩寄前男友家了,怎么办?

1 那你是要和别人一起去吗&#xff01;▼2 我马上想到我一老师了&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 当代父母对孩子的期望变化&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 这个小象打破我的观念&#xff1f;▼5 小个子买…

ctf php sql注入,CTF—攻防练习之HTTP—SQL注入(SSI注入)

主机&#xff1a;192.168.32.152靶机&#xff1a;192.168.32.161ssI是赋予html静态页面的动态效果&#xff0c;通过ssi执行命令&#xff0c;返回对应的结果&#xff0c;若在网站目录中发现了.stm .shtm .shtml等&#xff0c;且对应SSL输入没有过滤该网站可能存在SSI注入漏洞ssi…

OAuth 2.1 带来了哪些变化

OAuth 2.1 是 OAuth 2.0 的下一个版本, OAuth 2.1 根据最佳安全实践(BCP), 目前是第18个版本&#xff0c;对 OAuth 2.0 协议进行整合和精简, 移除不安全的授权流程, 并发布了 OAuth 2.1 规范草案, 下面列出了和 OAuth 2.0 相比的主要区别。⚡ 推荐使用 Authorization Code PKC…

54个站在人类智商巅峰的男人!告诉你2400年的物理学史里都有什么……

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不至于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

C#实现ByteBuffer类 .

在写网络程序的时候,经常需要往一个数组里面压数据或者取数据,而Java中再Java.nio中有个ByteBuffer能很方便的实现,Delphi中也有个Stream类有着同样的功能,这里我就模仿JAVA用C#做个最基础的ByteBuffer类 下面是代码 usingSystem;namespaceSystem.ByteBuffer...{ /**//// &l…

asp.net 6中的mini api和mvc api性能对比

在.net6发布时&#xff0c;带来了一个新的模板框架&#xff0c;mini api&#xff0c;那与之前的mvc api性能对比是什么样的呢&#xff1f;建了基于.net 6的两种模板项目&#xff0c;都实现了一个get /test01的api请求&#xff0c;代码如下&#xff1a;mini api:app.MapGet(&quo…

Android之水平ProgressBar多彩背景颜色

ProgressBar多彩的背景颜色 不废话,先爆照,如下图。 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_wi…

冰箱堪比「垃圾桶」?这根棒除味又保鲜,更能 99% 超强杀菌!

{}▲ 点击查看每天的饭菜、生鲜、零食、饮料、干货&#xff0c;总能把我家冰箱塞得满满当当。各种饭菜干货窜味儿&#xff0c;蔬果开始发烂发臭&#xff0c;每天打开冰箱都是一次「开门杀」……用柚子皮和竹炭包除味根本不行&#xff0c;从根源上改善冰箱环境才是硬道理。跟市面…

mac apache2 php,Mac OSX 之 PHP开发环境Apache2配置

time : 2018-03-23author : HGD_IS 李亮星一.事件因果一个星期前&#xff1a;不想下载XAMMP或者MAMP之类的IDE&#xff0c;而且下载完谷歌服务器一直只有放弃按钮&#xff0c;在Finder中打开也是不可打开文件状态&#xff0c;谷歌浏览器给出的解释是该App可能损害我的电脑&…

了解SQL Server触发器及触发器中的事务

引述 首先&#xff0c;写这篇文章的目的是望能把我对触发器的理解&#xff0c;分享出来与大家一起学习。如果你对触发器和事务的概念有些了解&#xff0c;这篇文章对你来说会是很简单&#xff0c;或能让你更进一步的了解触发器里面的一些故事&#xff0c;以及触发器中事务的故…

Android之Android studio如何解决Multiple dex files define Landroid/support/a(文件重复引用错误)

先爆错误的图片照,如下 define 可以理解文件重复的意思,所以这个错误是我导入了v4.jar包的原因,因为我项目里面本来就有v7.jar,如下图 解决办法一: 既然重复了,我就把这个v4.jar包删除掉,我删了之后就可以了,这个方法的前提是我知道哪个包重复了,不然我也不知道删除…

winform进度条实现

最近要给一个 Winform 项目添加功能&#xff0c;需要一个能显示进度条的弹窗&#xff0c;还要求能够中止任务&#xff0c;所以就做了一个&#xff0c;在此做个记录总结。虽然用的是比较老的 Winform 技术&#xff0c;不过其中的原理都是相通的。loading随处可见&#xff0c;比如…

keil之编辑环境配置

1.edit-->configuration 2. 3.开始是&#xff1a;ANSI编码&#xff0c;但一去掉&#xff1a;display modules&#xff0c;中文的注视就乱码了&#xff1b;请教Justchen&#xff0c;把编码改为GB2312&#xff0c;一切恢复正常&#xff1b;转载于:https://www.cnblogs.com/itl…

邮件服务器在企业网中的应用

简介&#xff1a; 电子邮件是因特网上最为流行的应用之一。如同邮递员分发投递传统邮件一样&#xff0c;电子邮件也是异步的&#xff0c;也就是说人们是在方便的时候发送和阅读邮件的&#xff0c;无须预先与别人协同。与传统邮件不同的是&#xff0c;电子邮件既迅速&#xff0c…

适配Win11!Edge重磅更新来袭

夜聊近日&#xff0c;微软对 Microsoft Edge 浏览器进行了两次重大更新。Microsoft Edge 95 正式版主要更新内容&#xff1a;版本号&#xff1a;95.0.1020.301.Microsoft Edge 右键菜单现已适配 Windows 11 风格&#xff0c;采用 Acrylic 和圆角设计&#xff0c;更加美观。2.你…

被清华免试录取的围棋天才,横扫60位围棋大师的最强AI,竟然都输给了高中生!?...

全世界只有3.14 % 的人关注了爆炸吧知识术业有专攻前不久&#xff0c;漫改剧《棋魂》的热播&#xff0c;让围棋狠狠火了一把。图片来源于豆瓣火到什么程度&#xff1f;有网友看完直接就打开了B站的围棋教程。但大部分网友&#xff0c;学不到几天就弃坑了&#xff0c;理由是&…

Android之如何解决Listview里面的值出现了2次

Listview里面的值出现了2次 不废话,先爆照 我去,这个listview里面的值怎么出现了2次,一直在找原因,后来解决了,先看下我的部分代码吧。 这是mainactivity.xml内容 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools=…

C# 10 新特性 —— 插值字符串优化

C# 10 新特性 —— 插值字符串优化Intro字符串应该是我们平时使用的最多的一个类型&#xff0c;从 C# 6 开始我们开始支持了插值字符串&#xff0c;使得我们可以更方便的进行字符串的操作&#xff0c;现在很多分析器也推荐我们使用插值这种写法&#xff0c;这能够使得我们的代码…

电影院为何有散落的青瓜?

1 摄像头&#xff1a;你套个袋子我就认不出来了吗&#xff1f;▼2 路边惊现大熊猫&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 好一个驼小姐&#xff08;via.豆瓣社死小组满杯草莓&#xff09;▼4 学弟的理解也不是无迹可寻▼5 台湾人过生日的方…

Ecshop:后台添加新功能栏目以及管理权限设置

一、添加菜单项打开 /admin/includes/inc_menu.php文件(后台框架左边菜单)&#xff0c;在最后添加一行如下&#xff1a;1$modules[17_other_menu][sns_list] sns_list.php?actlist;ecshop默认一级菜单项有16项&#xff0c;所里这里的例子从17开始。当然这个key可以随便取的&a…