1.2 Hashlib 模块API手册#

前言#

概述#

本文档主要介绍 CanMV 项目中加解密算法库-uhashlib。

读者对象#

本文档(本指南)主要适用于以下人员:

  • 技术支持工程师

  • 软件开发工程师

缩略词定义#

简称

说明

SHA1

Secure Hash Algorithm 1

SHA2

Secure Hash Algorithm 2

修订记录#

文档版本号

修改说明

修改者

日期

V1.0

初版

杨帆

2023-09-15

V1.1

修改示例程序,新增使用指南

杨帆

2023-10-10

V1.2

增加 SHA1 和 MD5 软件源生实现

杨帆

2023-10-13

1. 概述#

Uhashlib 库提供了基于 MD5、SHA1、SHA2 二进制数据的哈希算法。

2. API描述#

Uhashlib 库提供了三个类:md5、sha1 和 sha256,这些类分别实现了两个函数,数据更新函数 update(),消息摘要函数 digest()。其中,md5 和 sha1 是 micropython 的软件源生实现;sha256 由底层硬件加速器进行加速。

注意:本文档不会介绍 md5 和 sha1 详细步骤,具体请参考 micropython [hash官方文档] https://docs.micropython.org/en/latest/library/hashlib.html

2.1 类 sha256#

【描述】

类 sha256 用于创建一个 SHA256 哈希对象,并有选择地向其中发送数据。

【语法】

uhashlib.sha256([data])

【参数】

参数名称

描述

输入/输出

data(可选)

二进制数据

输入

【返回值】

返回值

描述

0

成功

非 0

失败

【注意】

【举例】

data = bytes([0]*64)
hash_obj = uhashlib.sha256(data)
hash_obj.update(data)
dgst = hash_obj.digest()
print(dgst)

【相关主题】

2.1.1 数据更新函数 update()#

【描述】

如果需要多次输入二进制数据,可以调用 update() 函数更新数据。

【语法】

obj.update(data)

【参数】

参数名称

描述

输入/输出

data

输入二进制数据

输入

【返回值】

返回值

描述

0

成功

非 0

失败

【注意】

【举例】

【相关主题】

2.1.2 消息摘要函数 digest()#

【描述】

返回所有输入数据的哈希值。

注意:在micropython中,使用此函数会完成最后的计算,不是单纯的将结果显示出来,所以只能调用一次,如果要多次使用该值,请保存到变量中。

【语法】

dgst = hash.digest()
print(dgst)

/*********** note ***********/
a = hash.digest()
b = hash.digest() # Error

【参数】

【返回值】

返回值

描述

0

成功

非 0

失败

【注意】

【举例】

【相关主题】

2.1.3 十六进制消息摘要函数 hexdigest()#

该方法未实现。使用 binascii.hexlify(hash.digest()) 可以达到类似的效果。

3. 示例程序#

计算 hash 值#

import uhashlib
import binascii

# init sha256 obj
obj = uhashlib.sha256()
# input data1
obj.update(b'hello')
# input data2
obj.update(b'world')
# compute digest
dgst = obj.digest()
print(binascii.hexlify(dgst))
# b'936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af'

4. 使用指南#

截止到当前版本,uhashlib 库已经测试了下列 case。测试程序参考 ./tests/cipher/cipher.py,启动 canmv 开发板,进入 REPL 之后,通过命令 import sdcard.app.tests.cipher.cipher 可直接运行测试 demo。

测试 case

测试结果

uhashlib

调用一次 update() 更新数据

pass

uhashlib

调用多次 update() 更新数据

pass