爬虫逆向加密技术详解之消息摘要算法(哈希算法):SHA系列加密

部署运行你感兴趣的模型镜像

一、‌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-9a-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

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值