mbedtls简介

ARM mbedtls使开发人员可以非常轻松地在(嵌入式产品中加入加密和 SSL/TLS 功能。它提供了具有直观的 API 和可读源代码的 SSL 库。该工具即开即用,可以在大部分系统上直接构建它,也可以手动选择和配置各项功能。
mbedtls 库提供了一组可单独使用和编译的加密组件,还可以使用单个配置头文件加入或排除这些组件。
从功能角度来看,该mbedtls分为三个主要部分:

  • SSL/TLS 协议实施。
  • 加密库。
  • X.509 证书处理库。

更多mbedtls教程

2017年5月我写下了这篇博文,于此同时我找到了前同事崔红鹏,我们俩一起写了一本关于mbedtls的图书。密码技术是熟练使用mbedtls的前提条件,本书除了mbedtls的详细使用介绍之外,还包括了许多密码学基础知识。希望大家可以在本书中找到物联网安全应用的实施技巧。

《密码技术与物联网安全:mbedtls开发实战》

mbedtls安装

下面介绍如何在 Ubuntu/Debian/raspbian环境下正确安装mbedtls。

克隆源代码

前往github克隆最新版的mbedtls源代码。获取最新版源代码之前需要在Ubuntu/Debian中正确安装git工具

 git clone https://github.com/ARMmbed/mbedtls.git

切换分支(可选)

切换到某个release分支,此处选择mbedtls-2.4。

git checkout -b mbedtls-2.4 origin/mbedtls-2.4

通过git checkout可检出具体分支

  • checkout 切换分支
  • -b mbedtls-2.4 创建本地分支
  • origin/mbedtls-2.4 切换到远程分支mbedtls-2.4

查看分支

通过git branch查看分支,确认已经切换到mbedtls-2.4分支

git branch development
* mbedtls-2.4

安装

mbedtls支持make、cmake等多种安装方式。下面介绍make方式和cmake方式编译源代码,并在目标主机中安装mbedtls动态链接库和头文件。本文推荐使用cmake工具安装mbedtls。

make方式

make SHARED=1
sudo make install
  • 使用make时默认情况下并不会生成动态链接库
  • SHARED=1 生成动态链接库

cmake方式(推荐)

cmake方式比make方式的步骤要多一些,如果目标主机并没有安装cmake工具,可通过apt-get工具安装cmake。

# 更新软件源
sudo apt-get update
# 通过软件源安装cmake
sudo apt-get install cmake
# 生成makefile文件,启用生成动态链接库选项
cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On .
# 以下步骤和make方式相同
make
sudo make install
  • -DUSE_SHARED_MBEDTLS_LIBRARY=On 生成动态链接库
  • 使用cmake时,不要忘记之后cmake指令之后的 . ,该点表示当前目录

修改mbedtls配置

mbedtls也可以通过修改配置文件的方式进行裁剪,mbedtls提供了几个参考模板,具体的config.h文件可参考mbedtls/configs目录,该目录中包括config-ccm-psk-tls1_2.h, config-mini-tls1_1.h等文件。和mbedtls安装方法相似,可通过make方法和cmake方法修改具体配置。

make方法

# 设置MBEDTLS_CONFIG_FILE宏,指向config-ccm-psk-tls1_2.h
CFLAGS="-I$PWD/configs -DMBEDTLS_CONFIG_FILE='<config-ccm-psk-tls1_2.h>'"
# 重新编译
make

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等

基础示例

示例代码

下面我们通过一个示例来说明如何使用mbedtls。这个示例通过介绍如何使用HMAC算法生成一个消息认证码。hmac-test.c代码如下:

#include <string.h>
#include <stdio.h>
#include "mbedtls/md.h"#define mbedtls_printf     printfint main(void)
{int ret;unsigned char secret[] = "a secret";unsigned char buffer[] = "some data to hash";unsigned char digest[32];mbedtls_md_context_t sha_ctx;mbedtls_md_init(&sha_ctx);memset(digest, 0x00, sizeof(digest));ret = mbedtls_md_setup(&sha_ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), 1);if (ret != 0){mbedtls_printf("  ! mbedtls_md_setup() returned -0x%04x\n", -ret);goto exit;}mbedtls_md_hmac_starts(&sha_ctx, secret, sizeof(secret) - 1);mbedtls_md_hmac_update(&sha_ctx, buffer, sizeof(buffer) - 1);mbedtls_md_hmac_finish(&sha_ctx, digest );mbedtls_printf("HMAC: ");for (int i = 0; i < sizeof(digest); i++)mbedtls_printf("%02X", digest[i]);mbedtls_printf("\n");exit:mbedtls_md_free( &sha_ctx );return ret;
}
  • hmac算法需要两个参数,一个称为秘钥,此处为secret,另一个称为消息,此处为buffer
  • 消息认证码保留在 digest 数组中
  • 此处hmac算法选择sha256算法作为单向散列函数,所以hmac的计算结果一定为32字节。
  • 在mbedtls中,消息认证码的生成分为三个步骤
    1. mbedtls_md_hmac_starts 设置密钥
    2. mbedtls_md_hmac_update 填充消息,本示例仅填充了一次
    3. mbedtls_md_hmac_finish 生成消息认证码,结果保存至digest中
  • 最后把digest使用HEX格式打印至控制台

cmake

在hmac-test.c同目录中新建一个名为Cmakelists.txt的文件,文件内容如下

cmake_minimum_required(VERSION 2.6)
# 定义工程名称
project("hmac-test")# 定义依赖动态链接库
set(libsmbedtlsmbedcrypto mbedx509
)set(targetshmac-test
)add_executable(hmac-test hmac-test.c)
target_link_libraries(hmac-test ${libs})

验证测试

# 生成makefile文件
cmake .
# 执行makefile,生成可执行文件hmac-test
make
# 运行可执行文件hmac-test
./hmac-test
# 控制台输出运行结果
HMAC: 7FD04DF92F636FD450BC841C9418E5825C17F33AD9C87C518115A45971F7F77E

更多角度验证

如果不确定mbedtls的运算结果,也可以编写一个node.js脚本,使用相同参数的情况下两者的计算结果应该完全相同。

const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'a secret');hmac.update('some data to hash');
console.log(hmac.digest('hex'));
// Prints:
// 7fd04df92f636fd450bc841c9418e5825c17f33ad9c87c518115a45971f7f77e

总结

  1. 安装mbedtls可使用make方法和cmake方法,两种方式均可正确安装mbedtls
  2. mbedtls提供三个重要动态链接库——libmbedtls.so libmbedcrypto.so libmbedx509.so
  3. 通过cmake方式可更方便的编写mbedtls应用

mbedtls安装与入门相关推荐

  1. Python:Scrapy的安装和入门案例

    Scrapy的安装介绍 Scrapy框架官方网址:http://doc.scrapy.org/en/latest Scrapy中文维护站点:http://scrapy-chs.readthedocs. ...

  2. windows下nodejs express安装及入门网站,视频资料,开源项目介绍

    windows下nodejs express安装及入门网站,视频资料,开源项目介绍,pm2,supervisor,npm,Pomelo,Grunt安装使用注意事项等总结 第一步:下载安装文件 下载地址 ...

  3. TensorFlow 安装及入门

    安装 入门 TensorFlow简介 基本操作 loading lazy 安装 上TensorFlow官网按照教程安装. 入门 以下学习内容follow这篇博客 TensorFlow简介 Tensor ...

  4. Ubuntu 18.04 安装 redis入门使用

    Ubuntu 18.04 安装 redis入门使用 1.安装 sudo apt-get install redis-server 2.查看redis运行状态 ps -ef | grep redis 3 ...

  5. IDE之EcliPse:EcliPse软件的简介、安装、入门、使用方法之详细攻略

    IDE之EcliPse:EcliPse软件的简介.安装.入门.使用方法之详细攻略 目录 EcliPse软件的简介 Eclipse特点 EcliPse软件的安装 EcliPse软件的入门 1.快捷键集合

  6. Python:Python多种集成开发环境(IDE,编译器)的简介、安装、入门、使用方法之详细攻略

    Python:Python多种集成开发环境(IDE,编译器)的简介.安装.入门.使用方法之详细攻略 目录 Python多种编译器的简介.安装.入门.使用方法 1.Anaconda 2.ipython ...

  7. Postman:Postman简介、安装、入门使用方法详细攻略

    Postman:Postman简介.安装.入门使用方法详细攻略 目录 Postman简介 Postman安装 Postman入门 1.图文教程 1.1.get案例 1.2.post案例 1.3.get ...

  8. Ansible 安装和入门

    Ansible 安装和入门 Ansible安装 ansible的安装方法有多种 EPEL源的rpm包安装: [root@ansible ~]#yum install ansible 编译安装 yum ...

  9. [Python爬虫] scrapy爬虫系列 一.安装及入门介绍

    前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...

最新文章

  1. ADO.NET编程小错误
  2. 做程序开发的你如果经常用Redis,这些问题肯定会遇到
  3. c# uri.host_C#| Uri.HostNameType属性与示例
  4. hbuilderx设置新建jsx后缀名_TypeScript编写前基本配置操作
  5. JS常见的几种数组去重方法
  6. Win32 远程线程
  7. libjpeg学习1:简单使用示例
  8. post 图片 byte 如何展示_图片展示:道路排水工程如何进行标准化施工
  9. 金刚爸爸是这么教育金刚儿子的
  10. P3935 Calculating
  11. TP3.2 URL传参及模板输出
  12. python3.6下载步骤_python3实现文件下载的方法总结
  13. 火狐扩展Firefox extension开发流程(学习记录)
  14. html5 excel网页版,一种网页版EXCEL的实现方法与流程
  15. 命令行工具抓取trace
  16. legacy引导gpt分区_装系统用什么分区?gpt分区及mbr分区详细教程(附带bios设置)
  17. 新版Google工具栏(For Firefox)发布
  18. 不可重复读,虚读和脏读的区别
  19. java 设置纸张大小设置_Java读取打印机自定义纸张.
  20. 如何对付不能卸载的杀毒软件

热门文章

  1. NIO学习笔记——缓冲区(Buffer)详解
  2. USB之Cyusb3014芯片原理之三GPIF原理(十一) 2022-03-08
  3. MTK 虚拟 sensor bring up (pick up) sensor1.0
  4. Nexys video ftp搭建和传输
  5. Excel密码保护破解代码
  6. Excel给文档设置(取消)密码(打开密码和修改密码)
  7. 一看就懂的网络协议五层模型(一)
  8. 浅谈一下低频高频时阻抗匹配的重要知识
  9. SHP(shapefile)文件详细格式介绍
  10. php启动,重启,关闭命令