计算机系统应用教程网站

网站首页 > 技术文章 正文

使用MD5/SHA1算法保存密码有多不安全?数据不会撒谎

btikc 2024-09-18 08:43:27 技术文章 20 ℃ 0 评论

曾几何时,用户密码都是明文存储的,后来安全意识有所提高后开始流行使用MD5/SHA,可是这些算法并不会带来很大的安全提升。

在这里我使用一张GTX 1080显卡对这些算法做个简单的抗爆测试,希望各位路人甲乙丙丁能有所收获。

哈希函数抗爆能力对比

MD5的破解性能:27589.7 MH/s,即每秒可进行275亿次尝试。

root@kali:~# hashcat -D2 -b -m 3200 -w 4 
hashcat (v6.0.0) starting in benchmark mode...

CUDA API (CUDA 10.2)
====================
* Device #1: GeForce GTX 1080, 8002/8116 MB, 20MCU

OpenCL API (OpenCL 1.2 pocl 1.5, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #2: pthread-Intel(R) Xeon(R) CPU E5-2678 v3 @ 2.50GHz, skipped

Benchmark relevant options:
===========================
* --opencl-device-types=2
* --workload-profile=4

Hashmode: 3200 - bcrypt $2*$, Blowfish (Unix) (Iterations: 32)

Speed.#1.........:    23877 H/s (157.00ms) @ Accel:32 Loops:16 Thr:12 Vec:1

Started: Thu Jun 25 14:06:12 2020
Stopped: Thu Jun 25 14:06:21 2020
root@kali:~# 

SHA1算法的破解性能:9259.9 MH/s,即每秒92亿次,可见使用SHA1算法并没有比MD5算法安全多少。

root@kali:~# hashcat -D2 -O -m 100 -b -w 4
hashcat (v6.0.0) starting in benchmark mode...

CUDA API (CUDA 10.2)
====================
* Device #1: GeForce GTX 1080, 8002/8116 MB, 20MCU

OpenCL API (OpenCL 1.2 pocl 1.5, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #2: pthread-Intel(R) Xeon(R) CPU E5-2678 v3 @ 2.50GHz, skipped

Benchmark relevant options:
===========================
* --opencl-device-types=2
* --optimized-kernel-enable
* --workload-profile=4

Hashmode: 100 - SHA1

Speed.#1.........:  9259.8 MH/s (144.89ms) @ Accel:64 Loops:1024 Thr:1024 Vec:1

Started: Thu Jun 25 14:03:54 2020
Stopped: Thu Jun 25 14:04:03 2020
root@kali:~#

SHA512算法的破解性能:1144.5 MH/s,即每秒11亿次,相比MD5及SHA1算法,抗爆能力有所提高,但还远远不够。

root@kali:~# hashcat -D2 -O -m 1700 -b -w 4
hashcat (v6.0.0) starting in benchmark mode...

CUDA API (CUDA 10.2)
====================
* Device #1: GeForce GTX 1080, 8002/8116 MB, 20MCU

OpenCL API (OpenCL 1.2 pocl 1.5, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #2: pthread-Intel(R) Xeon(R) CPU E5-2678 v3 @ 2.50GHz, skipped

Benchmark relevant options:
===========================
* --opencl-device-types=2
* --optimized-kernel-enable
* --workload-profile=4

Hashmode: 1700 - SHA2-512

Speed.#1.........:  1144.5 MH/s (293.12ms) @ Accel:16 Loops:1024 Thr:1024 Vec:1

Started: Thu Jun 25 14:04:19 2020
Stopped: Thu Jun 25 14:04:28 2020
root@kali:~#

好吧,那MD5/SHA1/SHA512等算法都不能用,那用什么好了?熟悉PHP的同学可能都知道,PHP有一个加密函数叫password_hash,它使用bcrypt算法来实现类似于MD5、SHA1等哈希算法的功能。不说废话,下面我们来看看这个算法扛爆能力又如何:

root@kali:~# php -r 'echo password_hash("password",PASSWORD_BCRYPT,["cost"=>5])."\n";'
$2y$05$Zt5bJfRWS02JDuN/RGxpgumWveBMbel3dFmlM91/hob2sYuuzSHva
root@kali:~# hashcat -D2 -b -m 3200 -w 4 
hashcat (v6.0.0) starting in benchmark mode...

CUDA API (CUDA 10.2)
====================
* Device #1: GeForce GTX 1080, 8002/8116 MB, 20MCU

OpenCL API (OpenCL 1.2 pocl 1.5, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #2: pthread-Intel(R) Xeon(R) CPU E5-2678 v3 @ 2.50GHz, skipped

Benchmark relevant options:
===========================
* --opencl-device-types=2
* --workload-profile=4

Hashmode: 3200 - bcrypt $2*$, Blowfish (Unix) (Iterations: 32)

Speed.#1.........:    23866 H/s (157.05ms) @ Accel:32 Loops:16 Thr:12 Vec:1

Started: Thu Jun 25 14:19:29 2020
Stopped: Thu Jun 25 14:19:37 2020
root@kali:~#

每秒钟仅仅23866次尝试,是SHA512的5万分之一、SHA1的的40万分之一、MD5的116万分之一!!!

这里测试的bcrypt算法Iterations为32,对应password_hash的cost参数为5,而cost可配置范围为4-31,默认为10,如果以cost10来测试,抗爆效果更好。

需要注意的是,password_hash函数的cost值越高耗费的算力越多,如当cost分别为4、10、16时,生成一个哈希耗时分别为0.013s、0.094s、4.619s,因此在使用时要权衡CPU处理能力并选择合适的cost值:

root@kali:~# time php -r 'echo password_hash("password",PASSWORD_BCRYPT,["cost"=>4])."\n";'
$2y$04$GrLT1KUczmaPG4wympFDuOL2E.y6yquF/Chttdq0LW4aRg4lXLGey
real 0m0.021s
user 0m0.013s
sys 0m0.009s
root@kali:~# time php -r 'echo password_hash("password",PASSWORD_BCRYPT,["cost"=>10])."\n";'
$2y$10$93hm/BJuOA2r3nj.k1.RMeLMv0TfAeAAu1ehwmPoVso4Titpo96dm
real	0m0.102s
user	0m0.094s
sys	0m0.008s
root@kali:~#
root@kali:~# time php -r 'echo password_hash("password",PASSWORD_BCRYPT,["cost"=>16])."\n";'
$2y$16$sF9IkXGi10Blt3Ds4l2MGOWaDuRs6aiJKuhwBCKoqC5OOtbujqJwK
real 0m4.623s
user 0m4.619s
sys 0m0.004s
root@kali:~#

哈希加不加盐的区别

MD5、SHA1、SHA512这些哈希算法是不带盐的,所以同时破解1个哈希跟1万、1亿个所耗费的时间其实差不多,仅仅是因为占用过多内存及磁盘带来些许的影响。但对于加了盐的bcrypt算法来说,每多一个哈希就多花一份时间,如果破解1个哈希花一天时间,那100个就要花100天。具体我就不在这里演示了,能意会就不言传了:)

除此之外,MD5、SHA1等非加盐算法还有个致命的弱点,即容易被彩虹表破解。彩虹表是使用索引技术存储密码跟哈希值对应关系的数据表,需要破解哈希时只需去查询彩虹表便能很快获取结果,而不用花费巨大的算力去破解。

总之,MD5/SHA1/SHA5的算法在高算力面前没什么抵抗力,跟加盐算法相比要更容易被破解。所以,建议不要再使用MD5/SHA了,PHP请使用password_hash函数,而Java则改用PBKDF2WithHmacSHA1等加盐算法。

#网络安全#

#PHP#

#Java#

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表