大家好,弟弟我第一次写博客,一定有许多不足.请各位大佬多指点,由于俺还是个苦逼高中生,所以私信可能得半个月一回复,见谅哦
环境 kali python2.7
在我们写程序之前,我们首先要知道的是Unix密码是以hash加密的,所以我们这里要用到python的crypt库,我们只需调用crypt.crypt()函数,并把我们需要加密的口令和salt传给他,该函数就会以字符串的形式返回密码的hash
- 我在学这里的时候就一直有个疑问.salt到底是啥呢,salt英文是1盐的意思,我便在网上找了好多资料,最后晓得,salt是盐值.这里就要涉及密码学了.
在我们早期第一代密码,如果用户密码为123,则数据库就会储存123,如果数据库泄露,会十分危险,所以渐渐地便产生了第二代密码,用户输入123,程序会讲123进行md5加密,即转化为202cb962ac59075b964b07152d234b70,并储存到数据库中.在用户登入的时候,会把用户输入的转化为md5,并与数据库中的加密的密码做比较.但是这样也是不安全的,hk’会将各种密码收集到一个强大的字典里面,然后利用脚本将字典里面的密码逐一进行加密并登入,如果登入成功,我们就会破解出用户的密码. 然后,第三代密码产生了,他的数据表里面多了一个字段,即盐值,这数据库中储存的就是md5(明文密码+salt),这样会大大加强了密码的安全性.
- 我们可以在py里输入help(‘crypt’)看一下帮助文档
- 然后让我们尝试一下用HX做盐值将123进行加密
了解了这个函数的用法,接下来.我们就可以来正式编写我们的程序了,在我们编写程序时,我们应该养成一个将脚本的各个功能分函数编写的良好习惯,在本程序里面,我们用了两个函数,testpass()函数从字典中读取密码,并将其以salt的盐值进行加密,遍历无果则返回.main函数将打开加密口令文件,并逐行读取口令文件中的内容,而每一行的用户名和密文都是用 : 分隔开的,我们可以用Python split() 通过指定分隔符对字符串进行切片.
程序总思路\
用户的密码是明文密码加salt来进行hash加密的,所以我们可以利用crypt库,将字典文件中的每一个密码提取出来.并对其进行salt的hash加密,与密文文件中的密文做比较,如果两者相等,即可获取密码,并返回一个提示,若全部字典文件都不相等,则破解不出来密码,会返回一个提示
最后附上脚本全部代码
import crypt
def testpass(cryptpass):
salt = cryptpas[0:2]
dictFile = open('dictionary.txt','r')
for word in dictFile.readlines():
word = word.strip('\n')
cryptword = crypt.crypt(word,salt)
if cryptword == cryptpass:
print('[+] password is '+ word+'\n')
return
print('[-] password not found')
return
def main():
passfile = open('password.txt')
for line in passfile.readlines():
if ':' in line:
user = line.split(':')[0]
cryptpass = line.split(':')[1],strip(' ')
print('chacking pass for '+user)
testpass(cryptpass)
if _name_ == '_main_':
main():