首发:Rice 嵌入式开发技术分享
作者:RiceDIY
概要
- Mbed TLS是一个开源、可移植、易于使用、代码可读性高的SSL库。可实现常用的加密/解密算法,X.509证书操作以及TLS/DTLS 协议。它的各个功能模块相对独立、耦合低,可以通过配置宏定义裁剪,非常适合用于嵌入式系统。它提供了具有直观的API和可读源代码的SSL 库。该库即开即用,可以在大部分系统上直接构建它,也可以手动选择和配置各项功能。
- MbedTLS库提供了一组可单独使用和编译的加密组件,还可以使用单个配置头文件加入或排除这些组件。从功能角度来看,该MbedTLS分为三个主要部分:
- SSL/TLS 协议实施。
- 一个加密库。
- 一个 X.509 证书处理库。
- MbedTLS遵循Apache 2.0开源许可协议,目前由TrustedFirmware维护(Linaro主持的一个治理开放社区项目),在Github上已收获 3k star,目前Github上发布的最新版本为2.26.0版本,开源仓库地址为:https://github.com/ARMmbed/mb...
- MbedTLS库提供了TLS/DTLS协议的实现,有了MbedTLS库之后意味着:
- TCP + TLS = TCP(S)
- MQTT + TLS = MQTT(S)
- HTTP + TLS = HTTP(S)
- COAP + DTLS = COAP(S)
- 目前进入万物互联的时代,网络通信(TCP/UDP)是必不可少的,同时各大厂商推出了各种通信模组,可以实现基于TCP/UDP通信的上层协议:HTTP、MQTT、COAP等等。这些应用层协议最大的特点是"明文传输",一旦有中间人想要截获篡改数据,非常容易 。
- 在我的网络协议栈解析的文章中,所有的实例都是以明文的形式进行试验。然后有网友问我,怎么保证数据安全呢?为了方便学习使用Mbed TLS库,我直接在ubuntu(18.04)上进行实操。
ubuntu安装MbedTLS库
下载源码
- 直接从github下载最新的MbedTLS源代码:https://github.com/ARMmbed/mb...
git clone https://github.com/ARMmbed/mbedtls.git
构建及安装MbedTLS库
- MbedTLS库提供了两种构建方式:make和cmake。并且可以在目标主机安装MbedTLS动态链接库和头文件。而本文采用cmake进行构建:
- 注:如果你的ubuntu没有安装cmake需要安装cmake构建工具,安装命令如下:
# 更新软件源
sudo apt-get update
# 安装cmake
sudo apt-get install cmake
- 编译安装MbedTLS,其中:
- -DUSE\_SHARED\_MBEDTLS\_LIBRARY=On 生成动态链接库
- cmake时,不要忘记之后cmake指令之后的".",该点表示当前目录
rice@rice:~/mbedtls_study/mbedtls$ cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On .
rice@rice:~/mbedtls_study/mbedtls$ make
rice@rice:~/mbedtls_study/mbedtls$ sudo make install
- 在概述中,我们提到MbedTLS是可以裁剪的(注:在这个实验中,我是按照默认配置);MbedTLS可以通过修改配置文件的方式进行裁剪,MbedTLS提供了几个参考模板,具体的config.h文件可在mbedtls/configs目录,参考文件config-ccm-psk-tls1\_2.h和config-mini-tls1\_1.h等文件。这里以CMake为例:
# 删除之前cmake相关中间文件,但是不包括CMakeLists.txt文件
find . -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} +
# 指定配置文件为 config-ccm-psk-tls1_2.h,重新编译
CFLAGS="-I$PWD/configs -DMBEDTLS_CONFIG_FILE='<config-ccm-psk-tls1_2.h>'" cmake .
- 安装之后查看是否安装成功:
- 默认情况下 动态链接库安装至 /usr/local/lib 包括libmbedtls.so libmbedcrypto.so libmbedx509.so
- 默认情况下 头文件安装至 /usr/local/include/mbedtls
- 默认情况下 mbedtls的相关工具将安装在 /usr/local/bin目录下,例如gen\_key等
SHA-1实验
- SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
- 单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。如果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确的散列值,从而保证了其安全性。SHA将输入流按照每块512位(64个字节)进行分块,并产生20个字节的被称为信息认证代码或信息摘要的输出。
- 该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。输入是按512位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。
- 通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。
- MAC(信息认证代码)就是一个散列结果,其中部分输入信息是密码,只有知道这个密码的参与者才能再次计算和验证MAC码的合法性。
SHA-1加密的实验:
- SHA-1加密测试代码(测试内容:RiceChen的SHA-1值):
#include <string.h>
#include <stdio.h>
#include "mbedtls/sha1.h"
#define mbedtls_printf printf
int main(void)
{
int ret;
unsigned char buffer[] = "RiceChen";
unsigned char digest[32] = {0};
mbedtls_sha1_context sha1_ctx;
memset(digest, 0x00, sizeof(digest));
mbedtls_sha1_init(&sha1_ctx);
mbedtls_sha1_starts(&sha1_ctx);
mbedtls_sha1_update(&sha1_ctx, buffer, sizeof(buffer) - 1);
mbedtls_sha1_finish(&sha1_ctx, digest);
int i = 0;
mbedtls_printf("SHA1: [");
while(digest[i])
{
mbedtls_printf("%02X", digest[i]);
i++;
}
mbedtls_printf("]\n");
exit:
mbedtls_sha1_free(&sha1_ctx);
return ret;
}
- 构建测试代码的CMakeLists.txt文件内容:
cmake_minimum_required(VERSION 2.6)
project("mbedtls-test")
set(libs
mbedtls
mbedcrypto
mbedx509
)
set(targets
mbedtls-test
)
add_executable(mbedtls-test mbedtls-test.c)
target_link_libraries(mbedtls-test ${libs})
- 编译测试代码:
rice@rice:~/mbedtls_study/demo$ mkdir build
rice@rice:~/mbedtls_study/demo$ cd build
rice@rice:~/mbedtls_study/demo/build$ cmake ../
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/rice/mbedtls_study/demo/build
rice@rice:~/mbedtls_study/demo/build$ make
Scanning dependencies of target mbedtls-test
[ 50%] Building C object CMakeFiles/mbedtls-test.dir/mbedtls-test.c.o
[100%] Linking C executable mbedtls-test
[100%] Built target mbedtls-test
rice@rice:~/mbedtls_study/demo/build$ ./mbedtls-test
SHA1: [CBD12068E2F91DF5DB148742DF108131AF76287E]
- 可以看到通过MbedTLS对"RiceChen"进行加密的SHA-1值:[CBD12068E2F91DF5DB148742DF108131AF76287E]
- 测试SHA1是否正确,可以通过https://1024tools.com/hash在...
- 注意:如果运行可执行文件出现如下问题:
- 问题:
rice@rice:~/mbedtls_study/demo/build$ ./mbedtls-test
./mbedtls-test: error while loading shared libraries: libmbedcrypto.so.0: cannot open shared object file: No such file or directory
- 解决方法:
rice@rice:~/mbedtls_study/demo/build$ sudo vim /etc/ld.so.conf //在新的一行中加入库文件所在目录
/usr/local/lib
rice@rice:~/mbedtls_study/demo/build$ sudo ldconfig //更新/etc/ld.so.cache文件
总结:
- MbedTLS是一个非常强大的开源库,而且功能上可以灵活的裁剪,对于嵌入式设备来说非常的友好。
- 后续将玩转一下这个库其他加解密算法。可以持续关注。
推荐阅读
更多嵌入式技术干货请关注Rice 嵌入式开发技术分享