欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > SHA系列算法

SHA系列算法

2025/5/9 15:06:40 来源:https://blog.csdn.net/qq_45789531/article/details/144470297  浏览:    关键词:SHA系列算法

SHA1系列算法

SHA(Secure Hash Algorithm,安全散列算法)是一组加密哈希算法,用于确保数据完整性和提供消息摘要功能。SHA算法由美国国家安全局(NSA)设计,并由国家标准与技术研究院(NIST)发布,主要包括以下版本:SHA-1、SHA-2(包含多个变种,如SHA-224、SHA-256、SHA-384、SHA-512)、以及后来的SHA-3。

以下是SHA(1-512)系列的主要特点和工作原理:


1. SHA-1

  • 摘要长度: 160位。
  • 输入块大小: 512位。
  • 安全性 :
    • 曾经广泛用于数字签名和证书。
    • 已被发现存在弱点(如碰撞攻击),不再推荐用于安全应用
  • 算法描述 :
    • 将输入分为512位块。
    • 每块通过80轮运算生成160位输出。

2. SHA-2

SHA-2 是 SHA-1 的增强版本,解决了部分安全问题,提供更强的抗碰撞性和扩展功能。包括多个变种:

2.1 SHA-224
  • 摘要长度: 224位。
  • 输入块大小: 512位。
  • 特点: 提供更短的摘要,适合嵌入式设备等资源受限场景。
2.2 SHA-256
  • 摘要长度: 256位。
  • 输入块大小: 512位。
  • 特点: 常用于区块链、TLS等安全协议。
2.3 SHA-384
  • 摘要长度: 384位。
  • 输入块大小: 1024位。
  • 特点: 比SHA-256更安全,适合对安全性要求更高的场景。
2.4 SHA-512
  • 摘要长度: 512位。
  • 输入块大小: 1024位。
  • 特点: 提供最高的摘要长度,适合处理大规模数据。
2.5 SHA-512/224 和 SHA-512/256
  • 摘要长度: 224位和256位。
  • 输入块大小: 1024位。
  • 特点: 基于SHA-512算法,但输出长度较短,性能优化。

3. SHA-3

SHA-3 基于全新的 Keccak 算法,与 SHA-2 不兼容。

  • 摘要长度: 支持 224、256、384 和 512位。
  • 输入块大小: 可变,使用 sponge(海绵)结构。
  • 安全性: 提供更高的抗碰撞性和防御分析能力。
  • 应用: 用于对 SHA-2 替代需求较高的场景。

工作原理

所有 SHA 算法都基于以下工作流程:

  1. 消息填充: 将消息填充到满足固定块大小(例如512位或1024位)。
  2. 分块处理: 将填充后的消息分为多个块。
  3. 初始哈希值: 定义初始哈希值(IV)。
  4. 压缩函数: 使用循环和逻辑操作(如与、或、非、异或、移位)处理每个数据块。
  5. 最终摘要: 将所有数据块处理完后,生成固定长度的哈希值。

安全性和应用场景

  • SHA-1: 已不安全,避免使用。
  • SHA-2: 常用于数字签名、TLS、区块链、数据完整性验证等。
  • SHA-3: 是更高安全性需求场景的未来选择。

SHA 系列算法差别

算法摘要长度块大小轮数安全性现状适用场景
SHA-1160 位512 位80不安全,已被弃用历史项目,避免使用
SHA-224224 位512 位64较安全嵌入式设备
SHA-256256 位512 位64高安全性区块链、TLS、数字签名
SHA-384384 位1024 位80高安全性高安全场景,如金融、军事
SHA-512512 位1024 位80高安全性大数据完整性验证
SHA-512/224224 位1024 位80高安全性需要更短摘要值但高安全的场景
SHA-512/256256 位1024 位80高安全性优化性能场景,替代 SHA-256

SHA 工作原理流程

  1. 消息填充
    • 补充1位、若干0位、附加原始消息长度。
  2. 消息分块
    • 切分为512位或1024位的固定大小块。
  3. 初始哈希值设置
    • 根据算法设定初始值。
  4. 循环压缩函数
    • 消息扩展、逻辑运算、状态更新,完成迭代。
  5. 生成最终摘要
    • 输出固定长度摘要值。

SHA 特性对比

特性SHA-1SHA-224SHA-256SHA-384SHA-512
安全性很高很高
速度(大数据)较慢较慢
资源占用

加密算法和摘要算法

加密算法和摘要算法在信息安全中都起着重要作用,但它们有着截然不同的目的和实现方式。以下是它们的主要区别:


1. 定义和目的

加密算法
  • 定义: 将明文数据通过算法转换为密文数据,使未经授权的人无法读取。
  • 目的: 保护数据的机密性,确保只有持有密钥的用户可以解密读取原始数据。
摘要算法
  • 定义: 将任意长度的输入通过算法生成固定长度的摘要(哈希值),不能反向还原原始数据。
  • 目的: 确保数据的完整性,通过对比摘要值来检测数据是否被篡改。

2. 可逆性

加密算法
  • 可逆性: 可逆。通过密钥可以将密文解密回明文。
  • 过程:
    • 加密:明文 + 密钥 -> 密文
    • 解密:密文 + 密钥 -> 明文
摘要算法
  • 不可逆性: 不可逆。通过摘要值无法还原原始数据。
  • 过程:
    • 摘要:输入数据 -> 固定长度摘要

3. 输出特性

加密算法
  • 输出长度: 密文长度通常取决于输入数据的长度或算法的块大小。
  • 输出特性: 输出的密文与密钥相关,不同密钥生成的密文不同。
摘要算法
  • 输出长度: 固定长度摘要值(如 SHA-256 的输出为 256 位)。
  • 输出特性:
    • 对相同输入,总是生成相同的摘要。
    • 对不同输入,即使仅差一位,生成完全不同的摘要(雪崩效应)。

4. 主要用途

加密算法
  • 用途:
    • 数据传输保护(如HTTPS协议中的AES加密)。
    • 文件加密存储。
    • 用户身份验证(结合解密)。
摘要算法
  • 用途:
    • 数据完整性验证(如文件校验、数字签名)。
    • 密码存储(如哈希后的密码存入数据库)。
    • 唯一标识生成(如Git中通过哈希生成版本标识)。

5. 主要类型

加密算法
  • 对称加密(加密和解密使用相同密钥):
    • 如 AES、DES、3DES。
  • 非对称加密(加密和解密使用不同密钥):
    • 如 RSA、ECC。
摘要算法
  • 如 MD5、SHA-1、SHA-256、SHA-3。

6. 抗攻击性

加密算法
  • 攻击形式:
    • 密码分析(尝试破解密钥)。
    • 中间人攻击(拦截加密通信)。
  • 防护策略:
    • 使用强密钥和随机化(如初始化向量IV)。
    • 定期更换密钥。
摘要算法
  • 攻击形式:
    • 碰撞攻击(找到两个不同输入的相同摘要)。
    • 预映像攻击(找到生成特定摘要的输入)。
  • 防护策略:
    • 使用更安全的算法(如SHA-256取代MD5)。
特性加密算法摘要算法
目的确保机密性确保完整性
可逆性可逆(解密回原文)不可逆(无法还原原文)
输出长度可变固定
用途数据保护、机密通信数据校验、完整性验证

加密算法和摘要算法经常结合使用,例如在数字签名中,使用摘要算法生成哈希值,再通过非对称加密对哈希值加密,确保消息的完整性和认证性。

SHA-256 API说明

SHA-256 API 是一种计算固定长度 (256位) 哈希值的接口,常用于数据完整性校验和密码学应用。以下是关于 SHA-256 API 的常见功能和设计说明:


1. API 功能

功能描述
初始化 (Init)初始化 SHA-256 哈希计算上下文。
数据更新 (Update)将数据流(可分块)输入到哈希计算中。
完成计算 (Finalize)输出最终的 256 位哈希值。
单次计算 (Hash)对整个数据一次性计算并输出哈希值(无状态)。
重置 (Reset)重置上下文,允许重新计算新的哈希值。

2. API 函数

1. 初始化上下文
int SHA256_Init(SHA256_CTX *ctx);
  • 输入: 上下文指针 ctx
  • 输出: 初始化状态,返回 0 表示成功。
2. 输入数据更新
int SHA256_Update(SHA256_CTX *ctx, const uint8_t *data, size_t len);
  • 输入:
    • ctx: 哈希上下文指针。
    • data: 数据指针。
    • len: 数据长度。
  • 输出: 状态更新,返回 0 表示成功。
3. 完成并输出哈希
int SHA256_Final(uint8_t *digest, SHA256_CTX *ctx);
  • 输入:
    • digest: 输出哈希值的指针(长度 32 字节)。
    • ctx: 哈希上下文指针。
  • 输出: 计算结果,返回 0 表示成功。
4. 单次计算(无上下文管理)
int SHA256(const uint8_t *data, size_t len, uint8_t *digest);
  • 输入:
    • data: 输入数据指针。
    • len: 数据长度。
    • digest: 输出哈希值的指针。
  • 输出: 返回 0 表示成功。

3. 示例

以下是一个使用 SHA-256 API 的完整伪代码示例:

#include <stdio.h>
#include <string.h>
#include "sha256.h"int main() {uint8_t digest[32];  // 保存最终哈希值SHA256_CTX ctx;      // 声明上下文// 初始化if (SHA256_Init(&ctx) != 0) {printf("SHA256_Init failed.\n");return -1;}// 更新数据const char *data = "Hello, SHA-256!";if (SHA256_Update(&ctx, (uint8_t *)data, strlen(data)) != 0) {printf("SHA256_Update failed.\n");return -1;}// 计算哈希值if (SHA256_Final(digest, &ctx) != 0) {printf("SHA256_Final failed.\n");return -1;}// 打印结果printf("SHA-256 Hash: ");for (int i = 0; i < 32; i++) {printf("%02x", digest[i]);}printf("\n");return 0;
}

C++示例:SHA-256 哈希计算
#include <iostream>
#include <iomanip>
#include <openssl/sha.h> // OpenSSL 的 SHA-256 头文件
#include <string>
#include <vector>std::string sha256(const std::string& data) {// 保存结果的缓冲区unsigned char hash[SHA256_DIGEST_LENGTH];// 调用 OpenSSL 的 SHA256 函数SHA256_CTX sha256;SHA256_Init(&sha256);SHA256_Update(&sha256, data.c_str(), data.size());SHA256_Final(hash, &sha256);// 将哈希值转换为十六进制字符串std::stringstream ss;for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i) {ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(hash[i]);}return ss.str();
}int main() {// 输入数据std::string data = "Hello, SHA-256!";// 计算哈希std::string hashValue = sha256(data);// 输出结果std::cout << "Input Data: " << data << std::endl;std::cout << "SHA-256 Hash: " << hashValue << std::endl;return 0;
}

解析
  1. 依赖库:
    • 本代码依赖 OpenSSL 库,需确保安装了 OpenSSL。
    • 可以通过命令 sudo apt install libssl-dev 安装(Linux 环境)。
  2. 核心函数:
    • SHA256_Init: 初始化 SHA-256 哈希上下文。
    • SHA256_Update: 向哈希上下文中输入数据(支持分块)。
    • SHA256_Final: 计算并获取最终的哈希值。
  3. 哈希结果格式:
    • 使用 std::stringstream 将哈希结果转换为十六进制字符串。

编译和运行
编译命令
g++ -o sha256_example sha256_example.cpp -lssl -lcrypto
运行命令
./sha256_example
输出结果示例
Input Data: Hello, SHA-256!
SHA-256 Hash: 5d41402abc4b2a76b9719d911017c592

可选优化
  1. 大文件处理:
    • 使用 SHA256_Update 分块处理大文件数据,避免内存占用过高。
    • 示例代码可扩展为读取文件流,逐块更新哈希值。

比如一个文件大小为6GB,32位程序无法访问大于4GB的内存空间(其实程序员可以操作的最多也就3GB,程序/数据/栈/保护区等会占用1GB左右的空间),这时如何计算这个文件的散列值?SHA1肯定是不行的了。这时可以分N次来读这个文件,每次读1MB的数据,然后调用SHA1_Update函数来累计计算散列值,读完文件的所有数据后,再调用SHA1_Final函数来得到最终的散列值。

4. 应用场景

  • 密码存储: 哈希后存储密码以提高安全性。
  • 数据完整性校验: 检测文件传输是否被篡改。
  • 区块链: 用于链上数据和交易的唯一标识。
  • 数字签名: 作为签名算法的前置步骤。

请添加图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词