# K230 SHA256 教程

## 什么是 SHA256？

**SHA256（Secure Hash Algorithm 256）**
是一种常用的哈希算法，输出长度固定为 256 位（32 字节），常用于：

* 数据完整性校验（如文件、通信）
* 数字签名与身份认证
* 区块链与密码学相关系统

## 接口简述

| 接口名                 | 功能说明             |
| ------------------- | ---------------- |
| `uhashlib.sha256()` | 创建 SHA256 对象     |
| `.update(data)`     | 向哈希对象输入数据（可多次调用） |
| `.digest()`         | 返回计算出的哈希值（bytes） |

## 示例：使用 SHA256 哈希计算

以下示例展示了如何利用 K230 的 `uhashlib` 模块进行 SHA256 哈希运算。

### 示例 1：一次性更新数据

```python
import uhashlib

# 初始化 SHA256 对象
obj = uhashlib.sha256()

# 输入消息
msg = b'\x45\x11\x01\x25\x0e\xc6\xf2\x66\x52\x24\x9d\x59\xdc\x97\x4b\x73' \
      b'\x61\xd5\x71\xa8\x10\x1c\xdf\xd3\x6a\xba\x3b\x58\x54\xd3\xae\x08' \
      b'\x6b\x5f\xdd\x45\x97\x72\x1b\x66\xe3\xc0\xdc\x5d\x8c\x60\x6d\x96' \
      b'\x57\xd0\xe3\x23\x28\x3a\x52\x17\xd1\xf5\x3f\x2f\x28\x4f\x57\xb8'

# 正确的参考哈希值（来自硬件加速器）
expected = b'\x1a\xaa\xf9\x28\x5a\xf9\x45\xb8\xa9\x7c\xf1\x4f\x86\x9b\x18\x90' \
           b'\x14\xc3\x84\xf3\xc7\xc2\xb7\xd2\xdf\x8a\x97\x13\xbf\xfe\x0b\xf1'

# 哈希计算
obj.update(msg)
digest = obj.digest()

# 验证结果
print("SHA256 一次 update 测试成功:", digest == expected)
```

### 示例 2：多次调用 `update()`

```python
obj = uhashlib.sha256()

# 分两次输入数据
obj.update(b'hello')
obj.update(b'world')

# 正确的 SHA256 值
expected = b'\x93\x6a\x18\x5c\xaa\xa2\x66\xbb\x9c\xbe\x98\x1e\x9e\x05\xcb\x78' \
           b'\xcd\x73\x2b\x0b\x32\x80\xeb\x94\x44\x12\xbb\x6f\x8f\x8f\x07\xaf'

digest = obj.digest()
print("SHA256 多次 update 测试成功:", digest == expected)
```

### 示例 3

```python
import uhashlib
import binascii

obj = uhashlib.sha256()
obj.update(b'helloworld')
print(binascii.hexlify(obj.digest()).decode())
```

## 应用场景示例

| 场景      | 说明                    |
| ------- | --------------------- |
| 通信安全校验  | 通过哈希验证接收内容是否被篡改       |
| 固件完整性验证 | 验证程序镜像文件或OTA包的哈希值     |
| 数字签名    | 为数据生成摘要参与签名运算         |
| 区块链与密码学 | 常用于区块哈希计算、Merkle 树等结构 |

## 常见问题解答

> **Q：可以多次调用 `update()` 吗？**

A：可以。`uhashlib.sha256()` 支持流式数据输入，适合处理大数据或分块读取的情况。

> **Q：调用 `.digest()` 后还能继续调用 `update()` 吗？**

A：不建议。`.digest()` 会结束当前哈希状态，若需继续，请重新创建 SHA256 对象。

## 延伸阅读

* 📘 [K230 Hashlib API 手册](../../api/cipher/K230_CanMV_Hashlib模块API手册.md)
* 🔐 [SHA256 标准定义 (NIST)](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf)
* 🧪 [在线 SHA256 哈希工具](https://emn178.github.io/online-tools/sha256.html)
