文章目录
- 一、什么是哈希算法,哈希算法有什么作用
-
-
- **什么是哈希算法?**
- **哈希算法的作用**
-
- [**1. 数据完整性验证**](#1. 数据完整性验证)
- [**2. 密码存储**](#2. 密码存储)
- [**3. 数字签名和数字证书**](#3. 数字签名和数字证书)
- [**4. 数据索引**](#4. 数据索引)
- [**5. 区块链和加密货币**](#5. 区块链和加密货币)
- [**6. 消息认证与密钥验证**](#6. 消息认证与密钥验证)
- [**7. 文件去重**](#7. 文件去重)
- **常见哈希算法**
- **总结**
-
- 二、各类哈希算法的代码实现
- 三、使用命令行哈希算法
-
-
- [**1. 基本格式**](#1. 基本格式)
- [**2. 常见哈希算法命令**](#2. 常见哈希算法命令)
-
- **(1)MD5**
- **(2)SHA-1**
- [**(3)SHA-2 系列**](#(3)SHA-2 系列)
- [**(4)SHA-3 系列**](#(4)SHA-3 系列)
- [**3. 计算字符串的哈希值**](#3. 计算字符串的哈希值)
-
- [**(1)计算字符串的 MD5**](#(1)计算字符串的 MD5)
- [**(2)计算字符串的 SHA-256**](#(2)计算字符串的 SHA-256)
- [**(3)计算字符串的 SHA3-512**](#(3)计算字符串的 SHA3-512)
- [**4. 其他选项**](#4. 其他选项)
- [**5. 示例操作**](#5. 示例操作)
-
- [**计算 MD5**](#计算 MD5)
- [**计算 SHA-256**](#计算 SHA-256)
- [**计算 SHA3-512**](#计算 SHA3-512)
-
一、什么是哈希算法,哈希算法有什么作用
什么是哈希算法?
哈希算法(Hash Algorithm)是一类特殊的数学函数,用于将任意长度的输入数据映射为固定长度的输出数据,这个输出通常称为哈希值 、消息摘要 或指纹。
哈希算法的主要特性
- 固定长度输出 :
- 无论输入数据的长度是多少,哈希算法都能产生长度固定的哈希值(例如,SHA-256 的输出始终是 256 位)。
- 不可逆性 :
- 根据哈希值,无法还原出原始输入数据。
- 雪崩效应 :
- 输入的微小变化(如改变一个字母)会导致输出的哈希值发生巨大变化。
- 抗碰撞性 :
- 很难找到两个不同的输入数据,经过哈希后得到相同的输出(称为"哈希碰撞")。
- 快速计算 :
- 哈希算法的设计使其能够快速生成哈希值,适合大规模数据处理。
哈希算法的作用
哈希算法在现代计算机系统中具有广泛的应用,主要体现在以下几个方面:
1. 数据完整性验证
哈希算法可以用来检测数据在传输或存储过程中是否被篡改。
- 在传输数据之前生成哈希值,并随数据一起发送。
- 接收方重新计算哈希值并与发送的哈希值对比,如果一致则数据未被篡改。
应用场景:
- 文件校验(例如 MD5 或 SHA-256 校验)。
- 软件分发中的校验码。
2. 密码存储
用户密码在存储时不会直接保存原文,而是保存经过哈希处理的值(通常还会加盐)。
- 用户登录时输入的密码会再次哈希并与存储的哈希值对比,以验证身份。
- 即使存储系统被攻破,也难以还原用户密码。
常用算法:
- SHA-2 家族(SHA-256)。
- bcrypt、scrypt(专为密码存储设计)。
3. 数字签名和数字证书
哈希算法用于生成文档的唯一摘要,用于签名和验证:
- 数字签名 :
- 文档哈希值由私钥加密,接收方用公钥解密验证,确保文档未被篡改。
- 数字证书 :
- 通过哈希算法和证书颁发机构签名,确认网站或软件的可信性。
4. 数据索引
哈希算法被广泛应用于高效的数据查找和索引。
- 哈希表(Hash Table) :
- 将数据通过哈希函数映射到特定的存储位置,实现快速查找。
- 缓存系统 :
- 哈希算法用于生成唯一键值,定位缓存数据。
5. 区块链和加密货币
在区块链中,哈希算法用于确保数据完整性和生成区块链结构。
- 区块链 :
- 每个区块都包含前一个区块的哈希值,形成链式结构,确保篡改后无法通过验证。
- 加密货币挖矿 :
- 使用工作量证明(PoW)机制,矿工需要找到满足特定条件的哈希值。
6. 消息认证与密钥验证
哈希算法结合密钥可用于生成消息认证码(MAC),确保消息来源和内容未被篡改。
- 例如 HMAC(基于哈希的消息认证码)。
7. 文件去重
在文件管理系统中,使用哈希值检测重复文件,因为相同的文件会生成相同的哈希值。
常见哈希算法
-
MD5(Message Digest 5):
- 输出长度:128 位。
- 特点:速度快,但抗碰撞性差,已被淘汰。
-
SHA-1(Secure Hash Algorithm 1):
- 输出长度:160 位。
- 特点:更安全,但已被发现存在漏洞,逐渐淘汰。
-
SHA-2(SHA-224、SHA-256、SHA-384、SHA-512):
- 输出长度:224 至 512 位。
- 特点:安全性高,广泛使用。
-
SHA-3(基于 Keccak 算法):
- 输出长度:224 至 512 位。
- 特点:最新标准,安全性更高。
-
其他算法:
- RIPEMD、Whirlpool 等。
总结
哈希算法是现代信息技术中的核心工具,其作用涵盖了数据完整性验证、安全存储、加密验证、高效索引等多个领域。选择合适的哈希算法取决于具体的应用场景及安全性需求。
二、各类哈希算法的代码实现
以下是使用 OpenSSL 实现常见哈希算法的 C 代码示例,包括 MD5 、SHA-1 、SHA-2 和 SHA-3 的实现。
完整示例代码
c
#include <openssl/evp.h>
#include <stdio.h>
#include <string.h>
void compute_hash(const char *algorithm, const char *data) {
// 初始化 OpenSSL 哈希上下文
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
const EVP_MD *md = EVP_get_digestbyname(algorithm);
if (md == NULL) {
printf("Unsupported algorithm: %s\n", algorithm);
EVP_MD_CTX_free(ctx);
return;
}
// 初始化哈希计算
EVP_DigestInit_ex(ctx, md, NULL);
// 提供输入数据
EVP_DigestUpdate(ctx, data, strlen(data));
// 获取哈希值
unsigned char hash[EVP_MAX_MD_SIZE];
unsigned int hash_len = 0;
EVP_DigestFinal_ex(ctx, hash, &hash_len);
// 打印哈希值
printf("%s hash of \"%s\": ", algorithm, data);
for (unsigned int i = 0; i < hash_len; i++) {
printf("%02x", hash[i]);
}
printf("\n");
// 释放上下文
EVP_MD_CTX_free(ctx);
}
int main() {
const char *data = "Hello, OpenSSL!";
// 计算并打印不同算法的哈希值
compute_hash("MD5", data); // MD5
compute_hash("SHA1", data); // SHA-1
compute_hash("SHA224", data); // SHA-224
compute_hash("SHA256", data); // SHA-256
compute_hash("SHA384", data); // SHA-384
compute_hash("SHA512", data); // SHA-512
compute_hash("SHA3-256", data); // SHA-3 (256 位)
compute_hash("SHA3-512", data); // SHA-3 (512 位)
return 0;
}
代码说明
-
核心函数:
compute_hash
- 输入参数:
algorithm
:指定哈希算法名称,例如MD5
、SHA256
、SHA3-256
。data
:要计算哈希值的输入数据。
- 功能:
- 使用 OpenSSL 的 EVP 接口计算哈希值。
- 打印结果。
- 输入参数:
-
支持的算法名称
- MD5 :
"MD5"
- SHA-1 :
"SHA1"
- SHA-2 :
"SHA224"
,"SHA256"
,"SHA384"
,"SHA512"
- SHA-3 :
"SHA3-224"
,"SHA3-256"
,"SHA3-384"
,"SHA3-512"
- MD5 :
-
主要步骤
- 初始化哈希上下文:
EVP_MD_CTX_new
。 - 获取哈希算法:
EVP_get_digestbyname
。 - 提供输入数据:
EVP_DigestUpdate
。 - 计算哈希值:
EVP_DigestFinal_ex
。
- 初始化哈希上下文:
-
安全性
- 推荐在安全场景中使用 SHA-2 或 SHA-3 ,避免使用 MD5 和 SHA-1。
运行结果:
三、使用命令行哈希算法
使用 OpenSSL 命令行工具,可以非常方便地计算各种哈希值,包括 MD5 、SHA-1 、SHA-2 和 SHA-3 等。以下是具体的操作方法:
1. 基本格式
bash
openssl dgst -<算法名称> <文件名>
2. 常见哈希算法命令
(1)MD5
计算文件的 MD5 哈希值:
bash
openssl dgst -md5 file.txt
输出示例:
plaintext
MD5(file.txt)= 098f6bcd4621d373cade4e832627b4f6
(2)SHA-1
计算文件的 SHA-1 哈希值:
bash
openssl dgst -sha1 file.txt
输出示例:
plaintext
SHA1(file.txt)= 356a192b7913b04c54574d18c28d46e6395428ab
(3)SHA-2 系列
-
SHA-224:
bashopenssl dgst -sha224 file.txt
-
SHA-256:
bashopenssl dgst -sha256 file.txt
-
SHA-384:
bashopenssl dgst -sha384 file.txt
-
SHA-512:
bashopenssl dgst -sha512 file.txt
(4)SHA-3 系列
需要支持 OpenSSL 1.1.1 或更高版本。
-
SHA3-224:
bashopenssl dgst -sha3-224 file.txt
-
SHA3-256:
bashopenssl dgst -sha3-256 file.txt
-
SHA3-384:
bashopenssl dgst -sha3-384 file.txt
-
SHA3-512:
bashopenssl dgst -sha3-512 file.txt
3. 计算字符串的哈希值
可以通过 echo
命令和管道计算字符串的哈希值:
(1)计算字符串的 MD5
bash
echo -n "Hello, OpenSSL!" | openssl dgst -md5
输出示例:
plaintext
(stdin)= 3a01be9d860c380a1df0df857d17ff86
(2)计算字符串的 SHA-256
bash
echo -n "Hello, OpenSSL!" | openssl dgst -sha256
输出示例:
plaintext
(stdin)= c38c1d067d2c4d99925160a8e53947e68890a5a4b6f76af71c818c48b995f456
(3)计算字符串的 SHA3-512
bash
echo -n "Hello, OpenSSL!" | openssl dgst -sha3-512
输出示例:
plaintext
(stdin)= a194121050c3cfa2fb23aefc46f057b7200a48602e8bfc8e8616a60a81df91c60635651c1f67dc75e3a0271da36563585b2a91673ae0438efb4c3af5bd529554
注意:
-n
参数用于避免echo
命令在字符串末尾添加换行符。|
用于将字符串作为输入传递给openssl dgst
。
4. 其他选项
(1)输出二进制哈希值
如果需要二进制格式的哈希值,可以使用 -binary
:
bash
openssl dgst -sha256 -binary file.txt > hash.bin
(2)指定输出为十六进制
默认输出为十六进制格式,但你可以显式指定:
bash
openssl dgst -sha256 -hex file.txt
(3)验证文件完整性
可以通过哈希值验证文件是否被篡改。例如:
-
计算文件哈希值并保存:
bashopenssl dgst -sha256 file.txt > file.hash
-
验证文件:
bashopenssl dgst -sha256 -verify file.hash file.txt
5. 示例操作
假设有一个文件 example.txt
,内容为 Hello, OpenSSL!
。
计算 MD5
bash
openssl dgst -md5 example.txt
输出:
plaintext
MD5(example.txt)= 3a01be9d860c380a1df0df857d17ff86
计算 SHA-256
bash
openssl dgst -sha256 example.txt
输出:
plaintext
SHA256(example.txt)= c38c1d067d2c4d99925160a8e53947e68890a5a4b6f76af71c818c48b995f456
计算 SHA3-512
bash
openssl dgst -sha3-512 example.txt
输出:
plaintext
SHA3-512(example.txt)= a194121050c3cfa2fb23aefc46f057b7200a48602e8bfc8e8616a60a81df91c60635651c1f67dc75e3a0271da36563585b2a91673ae0438efb4c3af5bd529554
通过这些命令,你可以快速计算文件或字符串的哈希值,适用于验证数据完整性和加密需求。