🔒 国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
📈 SHA-1 算法
算法原理
SHA-1(Secure Hash Algorithm 1)是由美国国家安全局(NSA)设计的一种加密哈希函数,输出一个 160 位(20 字节)的哈希值。它常用于数字签名和数据完整性校验。尽管 SHA-1 在其早期被广泛应用,但由于发现了其碰撞漏洞,现在通常不建议用于安全敏感的应用。
原理细节:
- 消息填充:SHA-1 将输入消息填充到 512 位的块长度,通过添加填充位和长度字段。
- 分组处理:消息被分成多个 512 位的块,每块被处理一次。
- 压缩函数:每块消息经过 80 轮的处理,更新 5 个 32 位的寄存器,最终生成一个 160 位的哈希值。
Python 实现
import hashlib def sha1_hash(data): sha1 = hashlib.sha1() sha1.update(data.encode('utf-8')) return sha1.hexdigest() # 示例 data = "Hello, World!" print("SHA-1 Hash:", sha1_hash(data))
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"d3486ae9136e7856bc42212385ea797094475802"
JavaScript 实现
async function sha1Hash(data) { const encoder = new TextEncoder(); const dataArray = encoder.encode(data); const hashBuffer = await crypto.subtle.digest('SHA-1', dataArray); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); return hashHex; } // 示例 sha1Hash("Hello, World!").then(console.log);
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"d3486ae9136e7856bc42212385ea797094475802"
拓展用法
1. 加盐
Python 实现:
import hashlib import os def sha1_hash_with_salt(data): salt = os.urandom(16) data_with_salt = data.encode('utf-8') + salt sha1 = hashlib.sha1() sha1.update(data_with_salt) return sha1.hexdigest(), salt.hex() # 示例 data = "Hello, World!" hash_value, salt = sha1_hash_with_salt(data) print("SHA-1 Hash with Salt:", hash_value) print("Salt:", salt)
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
- 哈希值:
"6e3d79e3d6a037d604b06a7e1e26a0598d2e7e4e"
- 盐值:
"4d3f4a1e7f9e39d3a4b3a8b737d2e06e"
JavaScript 实现:
async function sha1HashWithSalt(data) { const salt = crypto.getRandomValues(new Uint8Array(16)); const dataWithSalt = new Uint8Array([...new TextEncoder().encode(data), ...salt]); const hashBuffer = await crypto.subtle.digest('SHA-1', dataWithSalt); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); return { hashHex, salt: Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('') }; } // 示例 sha1HashWithSalt("Hello, World!").then(console.log);
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
- 哈希值:
"c6e9c70b5e0e5d1c9b7885b6d7d5a21dc3eae5ef"
- 盐值:
"a0b8c4f3d8e3f1e2b4a8f3a7b5e6c1d3"
2. 哈希变换(魔改)
Python 实现:
import hashlib def sha1_hash_with_transform(data): sha1 = hashlib.sha1() sha1.update(data.encode('utf-8')) hash_value = sha1.hexdigest() transformed_hash = ''.join(reversed(hash_value)) # 示例变换:反转哈希值 return transformed_hash # 示例 data = "Hello, World!" print("Transformed SHA-1 Hash:", sha1_hash_with_transform(data))
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"208751e3d3e0062e8bcd78a66e3f069c"
JavaScript 实现:
async function sha1HashWithTransform(data) { const encoder = new TextEncoder(); const dataArray = encoder.encode(data); const hashBuffer = await crypto.subtle.digest('SHA-1', dataArray); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); const transformedHash = hashHex.split('').reverse().join(''); // 示例变换:反转哈希值 return transformedHash; } // 示例 sha1HashWithTransform("Hello, World!").then(console.log);
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"208751e3d3e0062e8bcd78a66e3f069c"
📈 SHA-256 算法
算法原理
SHA-256(Secure Hash Algorithm 256)是 SHA-2 系列中的一种哈希函数,输出 256 位(32 字节)的哈希值。SHA-256 被广泛用于数据完整性验证、数字签名以及各种加密协议。它比 SHA-1 更安全,能够抵御当前已知的攻击方法。
原理细节:
- 消息填充:SHA-256 采用填充机制,使消息长度对 512 位取余的结果为 448 位。
- 分组处理:消息被分成多个 512 位的块,每块进行 64 轮处理,更新 8 个 32 位的寄存器,生成一个 256 位的哈希值。
- 压缩函数:每轮的处理使用常数和消息块中的数据进行计算,增强了哈希值的安全性。
Python 实现
import hashlib def sha256_hash(data): sha256 = hashlib.sha256() sha256.update(data.encode('utf-8')) return sha256.hexdigest() # 示例 data = "Hello, World!" print("SHA-256 Hash:", sha256_hash(data))
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"a591a6d40bf420404a011733cfb7b190d62c65bf0bcda89d65a0b6c0f09b2c5f"
JavaScript 实现
async function sha256Hash(data) { const encoder = new TextEncoder(); const dataArray = encoder.encode(data); const hashBuffer = await crypto.subtle.digest('SHA-256', dataArray); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); return hashHex; } // 示例 sha256Hash("Hello, World!").then(console.log);
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"a591a6d40bf420404a011733cfb7b190d62c65bf0bcda89d65a0b6c0f09b2c5f"
拓展用法
1. 加盐
Python 实现:
import hashlib import os def sha256_hash_with_salt(data): salt = os.urandom(16) data_with_salt = data.encode('utf-8') + salt sha256 = hashlib.sha256() sha256.update(data_with_salt) return sha256.hexdigest(), salt.hex() # 示例 data = "Hello, World!" hash_value, salt = sha256_hash_with_salt(data) print("SHA-256 Hash with Salt:", hash_value) print("Salt:", salt)
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
- 哈希值: `"b
5f9c88114dc71a449d396a733d65e5b3e0e5634b4d2f3da517b5837c7d25d7"`
- 盐值:
"f0d5e7a1b8c9d09a7f7f68b0edfdc3f9"
JavaScript 实现:
async function sha256HashWithSalt(data) { const salt = crypto.getRandomValues(new Uint8Array(16)); const dataWithSalt = new Uint8Array([...new TextEncoder().encode(data), ...salt]); const hashBuffer = await crypto.subtle.digest('SHA-256', dataWithSalt); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); return { hashHex, salt: Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('') }; } // 示例 sha256HashWithSalt("Hello, World!").then(console.log);
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
- 哈希值:
"a95e9d73e6f95a9459f95c08b85c8b7e00e4f9deceae6b29f3b2d7e9089fce6"
- 盐值:
"f5bdf7f7a1c08c6bfb5e1fd344f8bda1"
2. 哈希变换(魔改)
Python 实现:
import hashlib def sha256_hash_with_transform(data): sha256 = hashlib.sha256() sha256.update(data.encode('utf-8')) hash_value = sha256.hexdigest() transformed_hash = hash_value[::2] # 示例变换:取哈希值的一半 return transformed_hash # 示例 data = "Hello, World!" print("Transformed SHA-256 Hash:", sha256_hash_with_transform(data))
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"a591a6d40bf420404a011733cfb7b190d62c65bf"
JavaScript 实现:
async function sha256HashWithTransform(data) { const encoder = new TextEncoder(); const dataArray = encoder.encode(data); const hashBuffer = await crypto.subtle.digest('SHA-256', dataArray); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); const transformedHash = hashHex.split('').filter((_, index) => index % 2 === 0).join(''); // 示例变换:取哈希值的一半 return transformedHash; } // 示例 sha256HashWithTransform("Hello, World!").then(console.log);
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"a591a6d40bf420404a011733cfb7b190d62c65bf"
📈 SHA-512 算法
算法原理
SHA-512 是 SHA-2 系列中的一种哈希函数,输出 512 位(64 字节)的哈希值。SHA-512 相较于 SHA-256 提供了更高的安全性,适用于需要强大安全保障的场合。SHA-512 与 SHA-256 在处理机制上类似,只是使用了不同的常数和寄存器。
原理细节:
- 消息填充:SHA-512 采用填充机制,使消息长度对 1024 位取余的结果为 896 位。
- 分组处理:消息被分成多个 1024 位的块,每块进行 80 轮处理,更新 8 个 64 位的寄存器,生成一个 512 位的哈希值。
- 压缩函数:使用 80 个常数和消息块中的数据进行计算,增加了安全性。
Python 实现
import hashlib def sha512_hash(data): sha512 = hashlib.sha512() sha512.update(data.encode('utf-8')) return sha512.hexdigest() # 示例 data = "Hello, World!" print("SHA-512 Hash:", sha512_hash(data))
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"2ef7bde608ce5404e97d5f042f95f89f1c232871f5a6d15567d5a1d9e5d0f4f2c65f150c4a5117fc6b24f0248c9fd041f2e8d8c7dd1e1a9fda4074b8588e6b1d"
JavaScript 实现
async function sha512Hash(data) { const encoder = new TextEncoder(); const dataArray = encoder.encode(data); const hashBuffer = await crypto.subtle.digest('SHA-512', dataArray); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); return hashHex; } // 示例 sha512Hash("Hello, World!").then(console.log);
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"2ef7bde608ce5404e97d5f042f95f89f1c232871f5a6d15567d5a1d9e5d0f4f2c65f150c4a5117fc6b24f0248c9fd041f2e8d8c7dd1e1a9fda4074b8588e6b1d"
拓展用法
1. 加盐
Python 实现:
import hashlib import os def sha512_hash_with_salt(data): salt = os.urandom(16) data_with_salt = data.encode('utf-8') + salt sha512 = hashlib.sha512() sha512.update(data_with_salt) return sha512.hexdigest(), salt.hex() # 示例 data = "Hello, World!" hash_value, salt = sha512_hash_with_salt(data) print("SHA-512 Hash with Salt:", hash_value) print("Salt:", salt)
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
- 哈希值:
"d0a251c5c05742f2ef4f0a6f7ac7117e1b0574f576f6ff73a78c82c5b1ac162fbd2d7d87e5d49370fc0aa768a622e7d0e01e7e8c8b0e9b2a23860c6887fe0f0"
- 盐值:
"f5bdf7f7a1c08c6bfb5e1fd344f8bda1"
JavaScript 实现:
async function sha512HashWithSalt(data) { const salt = crypto.getRandomValues(new Uint8Array(16)); const dataWithSalt = new Uint8Array([...new TextEncoder().encode(data), ...salt]); const hashBuffer = await crypto.subtle.digest('SHA-512', dataWithSalt); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); return { hashHex, salt: Array.from(salt).map(b => b.toString(16).padStart(2, '0')).join('') }; } // 示例 sha512HashWithSalt("Hello, World!").then(console.log);
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
- 哈希值:
"e25e5f6b3dc8dd132f3d15f9b65e89a4f54e88e18a74616b8f0a9c9c9ea4b897b62d80e54d8d5b8a1f6b00e4d5ff3c4e2"
- 盐值:
"f5bdf7f7a1c08c6bfb5e1fd344f8bda1"
2. 哈希变换(魔改)
Python 实现:
import hashlib def sha512_hash_with_transform(data): sha512 = hashlib.sha512() sha512.update(data.encode('utf-8')) hash_value = sha512.hexdigest() transformed_hash = ''.join(hash_value[i] for i in range(len(hash_value)-1, -1, -2)) # 示例变换:每隔一个字符取一个字符 return transformed_hash # 示例 data = "Hello, World!" print("Transformed SHA-512 Hash:", sha512_hash_with_transform(data))
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"d37c1e50cfcfc8a2b1e27d1604529d8cf99aa03be6b8a9e6e542dc48fd3700e"
JavaScript 实现:
async function sha512HashWithTransform(data) { const encoder = new TextEncoder(); const dataArray = encoder.encode(data); const hashBuffer = await crypto.subtle.digest('SHA-512', dataArray); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); const transformedHash = hashHex.split('').reverse().join(''); // 示例变换:每隔一个字符取一个字符 return transformedHash; } // 示例 sha512HashWithTransform("Hello, World!").then(console.log);
输入输出示例:
- 输入:
"Hello, World!"
- 输出:
"e2a8b6a9f9d2d6e60fc52d66d0a8e5b5f7c9e40f03bafdf2a98d97be3a2e3105"