# DictAttack **Repository Path**: xdxlb_num1/dict-attack ## Basic Information - **Project Name**: DictAttack - **Description**: 西安电子科技大学计算机安全导论自主实验 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-12-23 - **Last Updated**: 2023-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 计算机安全导论自主实验二:字典攻击 | 姓名 | 学号 | | ---- | ----------- | | 李晨 | 19030100104 | ### 1. 实验要求 ​ 通过工具生成一定长度密码的字典,并通过密码攻击实现对进行过 hash 加密的函数进行攻击破解。 ### 2. 实验背景 ​ 字典攻击作为一种经典的密码攻击手段,是一种蛮力攻击,用于破解密码。攻击者通过尝试多次已知字典中的密码破解密钥、口令。这些字典的英文或前人所使用的密码通常由过去已经破解的数据库中泄漏。 ​ 字典攻击虽然原始,但这种攻击手段因为原理简单,往往是最先想到的攻击手段。下面的实验,我们模拟了 MD5 格式加密密码的字典生成和密码攻击,并对这种密码攻击手段进行一个简要的分析。 ### 3. 实验步骤 ​ 首先,生成密码字典,这里我们假定密码中可以包含大写字母、小写字母、数字,我们尝试生成了 1 位至 5 位密码的字典。 ​ 生成字典函数如下: ```python def generateLibrary(library, length): library = itertools.product(library, repeat=length) print("枚举完成") dic = open("passwotdlib{}.txt".format(length), "w", encoding='utf-8') for i in library: dic.writelines(i) dic.writelines("\n") dic.close() ``` ​ 测试函数如下: ```python if __name__ == "__main__": lowercase = "abcdefghijklmnopqrstuvwxyz" uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" number = "0123456789" root = lowercase + uppercase + number opassword = "aaaac" rpassword = hashlib.md5(opassword.encode(encoding="utf-8")).hexdigest() for i in range(1, 6): start = datetime.datetime.now() generateLibrary(root, length=i) end = datetime.datetime.now() print("成功生成{}位密码字典!\n".format(i)) print("用时:") print(end - start) print("\n") ``` ​ 运行结果如下: ```bash 枚举完成 成功生成1位密码字典! 用时: 0:00:00.000184 枚举完成 成功生成2位密码字典! 用时: 0:00:00.001466 枚举完成 成功生成3位密码字典! 用时: 0:00:00.082836 枚举完成 成功生成4位密码字典! 用时: 0:00:05.363463 枚举完成 成功生成5位密码字典! 用时: 0:06:06.903722 ``` ​ 然后我们进行了密码攻击的测试,攻击函数如下: ```python def dictAttack(path, password): file = open(path) for passwords in file: passwords = passwords.split("\n")[0] if password == hashlib.md5(passwords.encode(encoding="utf-8")).hexdigest(): print("破解成功,你的密码是:{}".format(passwords)) break file.close() return ``` ​ 测试函数如下,测试密码为 “uestc”: ```python if __name__ == "__main__": lowercase = "abcdefghijklmnopqrstuvwxyz" uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" number = "0123456789" root = lowercase + uppercase + number opassword = "uestc" rpassword = hashlib.md5(opassword.encode(encoding="utf-8")).hexdigest() start = datetime.datetime.now() dictAttack("passwotdlib5.txt", rpassword) end = datetime.datetime.now() print("用时:") print(end - start) print("\n") ``` ​ 测试结果如下: ![](https://pic.imgdb.cn/item/61c48eef2ab3f51d91b3457d.png) ​ 用时近三分钟。 ​ 完整代码可以参见项目地址 [https://gitee.com/xdxlb_num1/dict-attack](https://gitee.com/xdxlb_num1/dict-attack) ### 4. 实验分析 ​ 本次实验简单的模拟了字典攻击实验的流程,在过程中我体会到了字典攻击的诸多局限性。字典攻击本质上就是暴力尝试所有可能。我们可以有多种手段进行防治。 ​ 比如,我们从字典生成过程中可以感受到,随着密码位数的增加,生成时间成指数级增长,因为 n 位密码的总可能就有 $62^n$ 种。现在只生成了最多 5 位的密码,生成 6 位密码字典的时间肯定会超过 7 小时。所以我们可以通过系统默认增强密码强度(比如密码必须多于 6 位,或者密码中必须还有特殊字符)防止字典攻击。 ​ 还有,即使攻击者有现成的字典,我们也可以通过设置密码尝试障碍来预防字典攻击。 ​ 作为攻击者,我们要优化攻击字典和攻击手法,比如字典我们可以排除一些显然不可能作为密码的组合,或者以之前大型网站数据库中泄漏的密码作为字典进行“撞库”攻击,同时,我们也要积极寻找系统漏洞,主要是要找到绕过系统对尝试次数的限制,从而可以高效实现字典攻击。同时,由于这次实验是用单核运行的程序,如果可以把字典攻击程序改成并行程序,将会大大提高攻击效率。 ### 5. 实验体会 ​ 通过本次自主实验,体会了字典攻击的过程,也体会到了字典攻击的局限性。学会了很多东西。