SHA-256简介
SHA-256 是 **SHA-2(Secure Hash Algorithm 2)**家属中的一种哈希算法,由美国国家安全局计划,并于 2001 年发布。它能够将任意长度的数据映射为一个固定长度256 位,即 32 字节的哈希值,通常以 64 个十六进制字符的情势体现。SHA-256 被广泛用于数据完整性验证、数字署名、区块链等领。
SHA-256 的特点
- 固定输出长度:
- SHA-256 天生的哈希值始终是 256 位(32 字节)。
- 不可逆性:
- 雪崩效应:
- 抗碰撞性:
- 高效性:
- 安全性:
SHA-256 的应用场景
- 数据完整性验证:
- 通过比力文件的 SHA-256 值,可以验证文件是否被篡改。
- 数字署名:
- 用于天生数据的唯一标识,确保数据的真实性和完整性。
- 区块链:
- 比特币和其他加密货币使用 SHA-256 举行区块哈希盘算。
- 密码存储:
- 证书和密钥:
SHA-256 的工作原理
SHA-256 的盘算过程可以分为以下几个步骤:
1. 填凑数据
- 将输入数据的长度填充至 512 位(64 字节)的倍数。
- 填充方式:在数据末尾添加一个 1,然后添加若干个 0,末了添加一个 64 位的整数,体现原始数据的长度。
2. 初始化哈希值
- SHA-256 使用 8 个 32 位的状态变量(A, B, C, D, E, F, G, H),初始值为以下常量:
- A = 0x6A09E667
- B = 0xBB67AE85
- C = 0x3C6EF372
- D = 0xA54FF53A
- E = 0x510E527F
- F = 0x9B05688C
- G = 0x1F83D9AB
- H = 0x5BE0CD19
复制代码 3. 分块处置惩罚
- 将填充后的数据分割成若干个 512 位(64 字节)的块。
- 对每个块举行 64 轮处置惩罚。
4. 64 轮变动
- 每轮使用以下非线性函数和常量:
- Ch: Ch(x, y, z) = (x & y) ^ (~x & z)
- Maj: Maj(x, y, z) = (x & y) ^ (x & z) ^ (y & z)
- Σ0: Σ0(x) = (x >>> 2) ^ (x >>> 13) ^ (x >>> 22)
- Σ1: Σ1(x) = (x >>> 6) ^ (x >>> 11) ^ (x >>> 25)
- 常量表:使用 64 个预定义的常量值。
5. 更新哈希值
- 每轮处置惩罚后,更新状态变量(A, B, C, D, E, F, G, H)。
6. 输出哈希值
- 将终极的 8 个状态变量(A, B, C, D, E, F, G, H)按大端序拼接,天生 256 位的哈希值。
SHA-256 的伪代码
以下是 SHA-256 算法的简化伪代码:
- Input: 数据 data
- Output: 256 位的哈希值
- 1. 填充数据:
- - 在 data 末尾添加 1 和若干个 0,使其长度 ≡ 448 mod 512
- - 在末尾添加 64 位的原始数据长度
- 2. 初始化哈希值:
- A = 0x6A09E667
- B = 0xBB67AE85
- C = 0x3C6EF372
- D = 0xA54FF53A
- E = 0x510E527F
- F = 0x9B05688C
- G = 0x1F83D9AB
- H = 0x5BE0CD19
- 3. 对每个 512 位块进行处理:
- - 将块分割为 16 个 32 位字
- - 扩展为 64 个 32 位字
- - 进行 64 轮变换
- 4. 输出哈希值:
- - 将 A, B, C, D, E, F, G, H 按大端序拼接
- - 转换为 64 个十六进制字符
复制代码 SHA-256 的代码实现
以下是 SHA-256 的 C 语言实现的核心部分:
- #include <stdio.h>
- #include <string.h>
- #include <stdint.h>
- // SHA-256 状态变量
- typedef struct {
- uint32_t state[8]; // A, B, C, D, E, F, G, H
- uint8_t buffer[64]; // 缓冲区
- uint64_t length; // 数据长度
- } SHA256_CTX;
- // 初始化 SHA-256 上下文
- void SHA256_Init(SHA256_CTX *ctx) {
- ctx->state[0] = 0x6A09E667;
- ctx->state[1] = 0xBB67AE85;
- ctx->state[2] = 0x3C6EF372;
- ctx->state[3] = 0xA54FF53A;
- ctx->state[4] = 0x510E527F;
- ctx->state[5] = 0x9B05688C;
- ctx->state[6] = 0x1F83D9AB;
- ctx->state[7] = 0x5BE0CD19;
- ctx->length = 0;
- }
- // 更新 SHA-256 上下文
- void SHA256_Update(SHA256_CTX *ctx, const uint8_t *data, size_t len) {
- // 处理数据块
- }
- // 生成最终的 SHA-256 哈希值
- void SHA256_Final(SHA256_CTX *ctx, uint8_t digest[32]) {
- // 填充数据并生成哈希值
- }
- // 计算数据的 SHA-256 值
- void SHA256(const uint8_t *data, size_t len, uint8_t digest[32]) {
- SHA256_CTX ctx;
- SHA256_Init(&ctx);
- SHA256_Update(&ctx, data, len);
- SHA256_Final(&ctx, digest);
- }
复制代码 SHA-256 的优缺点
优点:
- 安全性高:抗碰撞性强,尚未发现有用的攻击方法。
- 固定输出长度:便于存储和比力。
- 高效性:盘算速率快,恰当处置惩罚大量数据。
缺点:
- 盘算资源消耗较大:相比 MD5,SHA-256 的盘算开销更大。
- 不恰当密码存储:固然安全,但通常需要与盐值结合使用。
以下是 MD5 和 SHA-256 的对比表格:
特性MD5SHA-256全称Message Digest Algorithm 5Secure Hash Algorithm 256-bit计划者Ronald Rivest美国国家安全局(NSA)发布时间19912001输出长度128 位(16 字节)256 位(32 字节)哈希值体现32 个十六进制字符64 个十六进制字符不可逆性是是雪崩效应是是抗碰撞性弱(存在碰撞风险)强(尚未发现有用碰撞攻击)盘算速率快较慢(比 MD5 慢)安全性不安全(已被证明存在碰撞毛病)安全(目前无有用攻击方法)应用场景文件校验、数据去重(不保举用于安全场景)文件校验、数字署名、区块链、密码存储填充方式填充至 448 位(56 字节)的倍数填充至 512 位(64 字节)的倍数状态变量4 个(A, B, C, D)8 个(A, B, C, D, E, F, G, H)处置惩罚轮数4 轮(每轮 16 次使用)64 轮非线性函数F, G, H, ICh, Maj, Σ0, Σ1常量表无64 个预定义常量初始值A=0x67452301, B=0xEFCDAB89, C=0x98BADCFE, D=0x10325476A=0x6A09E667, B=0xBB67AE85, C=0x3C6EF372, D=0xA54FF53A, E=0x510E527F, F=0x9B05688C, G=0x1F83D9AB, H=0x5BE0CD19保举使用场景非安全性场景(如文件校验)安全性要求高的场景(如数字署名、区块链)
- MD5:盘算速率快,但安全性不敷,已被证明存在碰撞毛病,不保举用于安全性要求高的场景。
- SHA-256:安全性高,抗碰撞性强,是目前广泛使用的哈希算法,恰当安全性要求高的场景。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |