文章目录
一、SHA系列算法介绍
SHA(Secure Hash Algorithm)是由美国国家安全局(NSA)设计的一组密码散列函数,包含多个版本:
- SHA-1:1995年发布,输出160位,因碰撞漏洞已不推荐使用。
- SHA-2系列:2001年发布,包含SHA-224、SHA-256、SHA-384、SHA-512等。
- SHA-3系列:2015年发布,基于Keccak算法,与SHA-2结构不同,但输出长度类似。包含SHA3-224、SHA3-256、SHA3-384、SHA3-512。
二、SHA系列特点
- 固定输出:无论输入多长,输出长度固定。
- 不可逆性:无法从哈希值反推原始数据。
三、如何一眼识别SHA加密?
3.1 长度判断
通常较难仅通过值一眼准确识别是哪种 SHA 算法的加密值,但可以根据长度初步判断:
- 40 个十六进制字符:可能是 SHA-0 或 SHA-1。
- 56 个十六进制字符:可能是 SHA-224 或 SHA3-224。
- 64 个十六进制字符:可能是 SHA-256 或 SHA3-256。
- 96 个十六进制字符:可能是 SHA-384 或 SHA3-384。
- 128 个十六进制字符:可能是 SHA-512 或 SHA3-512。
3.2 验证字符集
- 仅包含十六进制字符:确保哈希值只包含
0-9和a-f(a、b、c、d、e、f)。注意事项:哈希密文虽然是小写,但是别人也许会在生成后用.toUpperCase()全部转大写。 - 无其他字符:如
g-z、空格、特殊符号等。
3.3 搜索初始化变量
SHA-1 的初始化变量为 5 个 32 位变量:
IV = [
0x67452301,
0xEFCDAB89,
0x98BADCFE,
0x10325476,
0xC3D2E1F0
]
SHA-224 的初始化变量为 8 个 32 位变量中的前 7 个:
IV = [
0xC1059ED8,
0x367CD507,
0x3070DD17,
0xF70E5939,
0xFFC00B31,
0x68581511,
0x64F98FA7
]
SHA-256 的初始化变量为 8 个 32 位变量:
IV = [
0x6A09E667,
0xBB67AE85,
0x3C6EF372,
0xA54FF53A,
0x510E527F,
0x9B05688C,
0x1F83D9AB,
0x5BE0CD19
]
SHA-384 的初始化变量为 8 个 64 位变量中的前 6 个:
IV = [
0xCBBB9D5DC1059ED8,
0x629A292A367CD507,
0x9159015A3070DD17,
0x152FECD8F70E5939,
0x67332667FFC00B31,
0x8EB44A8768581511
]
SHA-512 的初始化变量为 8 个 64 位变量:
IV = [
0x6A09E667F3BCC908,
0xBB67AE8584CAA73B,
0x3C6EF372FE94F82B,
0xA54FF53A5F1D36F1,
0x510E527FADE682D1,
0x9B05688C2B3E6C1F,
0x1F83D9ABFB41BD6B,
0x5BE0CD19137E2179
]
小技巧:可以将初始化变量作为SHA的特征值,没有魔改的情况下搜索十六进制值,如果搜不到,复制去控制台输出转换后搜索。 如果搜到了,点击进入SHA内部,打上断点,重新触发断点,从堆栈(Call Stack,堆栈运行逻辑从下往上) ,从上往下依次查看哪里调用了特征值,就可以找到加密位置。
3.4 库函数或自定义函数
如果代码中使用了SHA相关的库(如CryptoJS)或函数名包含SHA,可确认是SHA哈希。
3.5 自用小技巧
遇到需要登录网站,用 123456 当密码进行测试,如果返回的加密值开头7c就可以快速判断,只需要记sha1:
- sha1密文: 7c4a8d09ca3762af61e59520943dc26494f8941b
四、实现SHA加密
4.1 JS实现SHA加密
const crypto = require('crypto');
function hashString(sha_n, plaintext) {
const hash = crypto.createHash(sha_n).update(plaintext).digest('hex');
return {
hash: hash,
length: hash.length
};
}
const plaintext = '123456';
const sha1 = hashString('sha1', plaintext);
const sha224 = hashString('sha224', plaintext);
const sha256 = hashString('sha256', plaintext);
const sha384 = hashString('sha384', plaintext);
const sha512 = hashString('sha512', plaintext);
const sha3_224 = hashString('sha3-224', plaintext);
const sha3_256 = hashString('sha3-256', plaintext);
const sha3_384 = hashString('sha3-384', plaintext);
const sha3_512 = hashString('sha3-512', plaintext);
console.log('SHA-1 Hash密文:', sha1.hash);
console.log("SHA-1 Hash密文长度:", sha1.length);
console.log('----------------------------------------------------');
console.log('SHA-224 Hash密文:', sha224.hash);
console.log("SHA-224 Hash密文长度:", sha224.length);
console.log('----------------------------------------------------');
console.log('SHA-256 Hash密文:', sha256.hash);
console.log("SHA-256 Hash密文长度:", sha256.length);
console.log('----------------------------------------------------');
console.log('SHA-384 Hash密文:', sha384.hash);
console.log("SHA-384 Hash密文长度:", sha384.length);
console.log('----------------------------------------------------');
console.log('SHA-512 Hash密文:', sha512.hash);
console.log("SHA-512 Hash密文长度:", sha512.length);
console.log('----------------------------------------------------');
console.log('SHA3-224 Hash密文:', sha3_224.hash);
console.log("SHA3-224 Hash密文长度:", sha3_224.length);
console.log('----------------------------------------------------');
console.log('SHA3-256 Hash密文:', sha3_256.hash);
console.log("SHA3-256 Hash密文长度:", sha3_256.length);
console.log('----------------------------------------------------');
console.log('SHA3-384 Hash密文:', sha3_384.hash);
console.log("SHA3-384 Hash密文长度:", sha3_384.length);
console.log('----------------------------------------------------');
console.log('SHA3-512 Hash密文:', sha3_512.hash);
console.log("SHA3-512 Hash密文长度:", sha3_512.length);
运行结果:
SHA-1 Hash密文: 7c4a8d09ca3762af61e59520943dc26494f8941b
SHA-1 Hash密文长度: 40
----------------------------------------------------
SHA-224 Hash密文: f8cdb04495ded47615258f9dc6a3f4707fd2405434fefc3cbf4ef4e6
SHA-224 Hash密文长度: 56
----------------------------------------------------
SHA-256 Hash密文: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
SHA-256 Hash密文长度: 64
----------------------------------------------------
SHA-384 Hash密文: 0a989ebc4a77b56a6e2bb7b19d995d185ce44090c13e2984b7ecc6d446d4b61ea9991b76a4c2f04b1b4d244841449454
SHA-384 Hash密文长度: 96
----------------------------------------------------
SHA-512 Hash密文: ba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413
SHA-512 Hash密文长度: 128
----------------------------------------------------
SHA3-224 Hash密文: 6be790258b73da9441099c4cb6aeec1f0c883152dd74e7581b70a648
SHA3-224 Hash密文长度: 56
----------------------------------------------------
SHA3-256 Hash密文: d7190eb194ff9494625514b6d178c87f99c5973e28c398969d2233f2960a573e
SHA3-256 Hash密文长度: 64
----------------------------------------------------
SHA3-384 Hash密文: 1fb0da774034ba308fbe02f3e90dc004191df7aec3758b6be8451d09f1ff7ec18765f96e71faff637925c6be1d65f1cd
SHA3-384 Hash密文长度: 96
----------------------------------------------------
SHA3-512 Hash密文: 64d09d9930c8ecf79e513167a588cb75439b762ce8f9b22ea59765f32aa74ca19d2f1e97dc922a3d4954594a05062917fb24
4d1f8e72f2ed02a58ed7534f94d27
SHA3-512 Hash密文长度: 128
4.2 Python实现SHA加密
import hashlib
def hashString(sha_n, plaintext):
hash_obj = getattr(hashlib, sha_n)()
hash_obj.update(plaintext.encode())
hash_hex = hash_obj.hexdigest()
return {
'hash': hash_hex,
'length': len(hash_hex)
}
plaintext = '123456'
sha1 = hashString('sha1', plaintext)
sha224 = hashString('sha224', plaintext)
sha256 = hashString('sha256', plaintext)
sha384 = hashString('sha384', plaintext)
sha512 = hashString('sha512', plaintext)
sha3_224 = hashString('sha3_224', plaintext)
sha3_256 = hashString('sha3_256', plaintext)
sha3_384 = hashString('sha3_384', plaintext)
sha3_512 = hashString('sha3_512', plaintext)
print('SHA-1 Hash密文:', sha1['hash'])
print("SHA-1 Hash密文长度:", sha1['length'])
print('----------------------------------------------------')
print('SHA-224 Hash密文:', sha224['hash'])
print("SHA-224 Hash密文长度:", sha224['length'])
print('----------------------------------------------------')
print('SHA-256 Hash密文:', sha256['hash'])
print("SHA-256 Hash密文长度:", sha256['length'])
print('----------------------------------------------------')
print('SHA-384 Hash密文:', sha384['hash'])
print("SHA-384 Hash密文长度:", sha384['length'])
print('----------------------------------------------------')
print('SHA-512 Hash密文:', sha512['hash'])
print("SHA-512 Hash密文长度:", sha512['length'])
print('----------------------------------------------------')
print('SHA3-224 Hash密文:', sha3_224['hash'])
print("SHA3-224 Hash密文长度:", sha3_224['length'])
print('----------------------------------------------------')
print('SHA3-256 Hash密文:', sha3_256['hash'])
print("SHA3-256 Hash密文长度:", sha3_256['length'])
print('----------------------------------------------------')
print('SHA3-384 Hash密文:', sha3_384['hash'])
print("SHA3-384 Hash密文长度:", sha3_384['length'])
print('----------------------------------------------------')
print('SHA3-512 Hash密文:', sha3_512['hash'])
print("SHA3-512 Hash密文长度:", sha3_512['length'])
运行结果:
SHA-1 Hash密文: 7c4a8d09ca3762af61e59520943dc26494f8941b
SHA-1 Hash密文长度: 40
----------------------------------------------------
SHA-224 Hash密文: f8cdb04495ded47615258f9dc6a3f4707fd2405434fefc3cbf4ef4e6
SHA-224 Hash密文长度: 56
----------------------------------------------------
SHA-256 Hash密文: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
SHA-256 Hash密文长度: 64
----------------------------------------------------
SHA-384 Hash密文: 0a989ebc4a77b56a6e2bb7b19d995d185ce44090c13e2984b7ecc6d446d4b61ea9991b76a4c2f04b1b4d244841449454
SHA-384 Hash密文长度: 96
----------------------------------------------------
SHA-512 Hash密文: ba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413
SHA-512 Hash密文长度: 128
----------------------------------------------------
SHA3-224 Hash密文: 6be790258b73da9441099c4cb6aeec1f0c883152dd74e7581b70a648
SHA3-224 Hash密文长度: 56
----------------------------------------------------
SHA3-256 Hash密文: d7190eb194ff9494625514b6d178c87f99c5973e28c398969d2233f2960a573e
SHA3-256 Hash密文长度: 64
----------------------------------------------------
SHA3-384 Hash密文: 1fb0da774034ba308fbe02f3e90dc004191df7aec3758b6be8451d09f1ff7ec18765f96e71faff637925c6be1d65f1cd
SHA3-384 Hash密文长度: 96
----------------------------------------------------
SHA3-512 Hash密文: 64d09d9930c8ecf79e513167a588cb75439b762ce8f9b22ea59765f32aa74ca19d2f1e97dc922a3d4954594a05062917fb24d1f8e72f2ed02a58ed7534f94d27
SHA3-512 Hash密文长度: 128
977

被折叠的 条评论
为什么被折叠?



