彩虹表的攻击与防御
使用RainbowCrack理解彩虹表攻击的原理以及进行攻击破密实验,掌握python编写使用md5算法进行加密以及抵御彩虹表攻击的要点。
介绍:
使用RainbowCrack理解彩虹表攻击的原理以及进行攻击破密实验,掌握python编写使用md5算法进行加密以及抵御彩虹表攻击的要点。
目录
一、预备知识
1)HASH 哈希是一种将任意长度的数据映射到固定长度的哈希值的算法。这种 映射方式具有高度的压缩性,可以将大量数据精简为简短的哈希值。然而,这种 压缩并不意味着数据的丢失或损坏,而是通过一种不可逆的方式将数据转化为独 特的标识符。哈希算法具有快速计算的特点,这使得它们在许多应用中都表现出 色,例如密码学和数据检索。常见的哈希算法包括 MD5、SHA-1 和 SHA-256。 这些算法通过独特的计算方式生成特定长度的哈希值,例如 MD5 生成的哈希值 为 128 位,而 SHA-1 和 SHA-256 则生成 160 位和 256 位的哈希值。这些算法在保 证数据安全性和完整性方面发挥着重要作用。
2)RainbowCrack:生成彩虹表的工具,是 Philippe Oechslin 更快的时间记忆权衡 技术的一般简易实现。能够实现全时间内存权衡工具套件,包括彩虹表生成,排序,转换和查找;支持任何哈希算法的彩虹表;支持任何字符集的彩虹表;支持原始文件格式(.rt)和压缩文件格式(.rtc)的彩虹表;计算多核处理器支持;使用 NVIDIA GPU 进行 GPU 加速(CUDA 技术);采用 AMD GPU 的 GPU 加速(OpenCL 技术);具有多个 GPU 的 GPU 加速;以及相应的系统兼容。
3)MD5 消息摘要算法(MD5 Message-Digest Algorithm):一种被广泛使用的密码散列函数,可以产生出一个 128 位(16 字节)的散列值(hash value),用于 确保信息传输完整一致。MD5 由美国密码学家罗纳德·李维斯特(RonaldLinn Rivest)设计,于 1992 年公开,用以取代 MD4 算法。
二、环境配置
在Window10系统上安装python和RainbowCrack



三、MD5加密
以防御者的视角,编写对于4 位密码进行md5 加密的python脚本,实现对英文-数字-符号字符串和中文利用md5消息摘要算法进行加密,并实现交互输入输出功能。创建一个python脚本文件,用记事本打开并编写代码,完成后利用本地的python环境在终端运行脚本。
#-*- coding:utf-8 -*-
import hashlib #导入hash库函数
def is_chinese(input_string): #判断输入是否为中文
for char in input_string:
if not ('\u4e00' <= char <= '\u9fff'):
return False
return True
str = input("请输入您需要加密的对象:")
if is_chinese(str): #如果是中文
md5_chinese = hashlib.md5() # 创建md5对象
md5_chinese.update(str.encode('utf-8')) # 对中文编码
md5_chinese_res = md5_chinese.hexdigest() # 进行加密获取加密后的结果
print("使用md5加密后的密文是:",md5_chinese_res) #打印加密后的密码
else:
md5_object = hashlib.md5()
md5_object.update(str.encode('ascii')) #转为2进制
md5_result = md5_object.hexdigest() #获取加密结果
print("使用md5加密后的密文是:",md5_result) #打印加密后的密码
is_chinese 函数:接受一个字符串作为输入,然后检查字符串中的每个字符是否为中文。如果字符串中包含非中文字符,则函数返回False,否则返回True。
用户输入:通过 input 函数获取用户输入的字符串。
判断输入类型:使用 is_chinese 函数判断输入字符串是中文还是英文。
MD5哈希加密:如果输入字符串是中文,使用 hashlib.md5() 创建一个MD5哈希对象,然后使用 update 方法将字符串编码为UTF-8,并获取哈希的16进制表示;如果输入字符串是英文,同样使用 hashlib.md5() 创建MD5哈希对象,但是将字符串编码为ASCII。最后使用hexdigest函数输入的明文进行加密。
加密测试:
四、彩虹攻击破译
用cmd命令行打开rainbowcrack-1.8-win64所在位置,使用命令:
rtgen md5 numeric 4 4 0 3000 400000 0
生成针对使用md5加密算法进行加密的4位数字破译的40000个长度为3000的彩虹链

使用rtsort .对彩虹表进行排序

对用md5加密的4位数字进行解密
rcrack.exe . -h 56584778d5a8ab88d6393cc4cd11e090
五、防御彩虹攻击
以防御者的视角,通过某种措施来抵御彩虹表破解或者使攻击者的破解难度和成本大大增加。
加盐:加盐是在用户密码的基础上添加一个随机生成的字符串,然后再进行哈希运算。这个随机字符串被称为盐,它使得相同的密码在加盐后得到的哈希值也是不同的。彩虹表攻击的主要优势在于事先计算大量密码的哈希值,并将其存储在表中。通过加盐,即使密码相同,由于每个用户都有唯一的盐,最终的哈希值也会有所不同,使得事先计算的表无法直接用于攻击。
迭代哈希:迭代哈希是对密码进行多次迭代的哈希运算,增加破解密码所需的时间。通常,哈希值会反复作为输入进行更多次的哈希运算,从而产生最终的哈希值。彩虹表攻击的速度主要来自于事先计算大量的哈希值,而迭代哈希使得每个尝试的密码需要更多的计算时间。适当选择迭代次数可以在保证用户登录时的合理响应时间的同时,有效地增加攻击者进行彩虹表攻击时所需的计算时间。
1.加盐实现
在存储密码时,随机生成一个盐值,将盐值与原密码结合后再做散列进行哈希,并将盐值和哈希值一同存储。在验证密码时,使用存储的盐值再次哈希输入密码,然后与存储的哈希值比较。
#-*- coding:utf-8 -*-
import hashlib #导入hash库函数
def is_chinese(input_string): #判断输入是否为中文
for char in input_string:
if not ('\u4e00' <= char <= '\u9fff'):
return False
return True
str = input("请输入您需要加密的对象:")
salt = input("请输入您需要添加的扰动字符:") #加盐字符
saltstr = str+salt # 将扰动字符合并到原字符
if is_chinese(str): #如果是中文
md5_chinese = hashlib.md5() # 创建md5对象
md5_chinese.update(saltstr.encode('utf-8')) # 对中文编码
md5_chinese_res = md5_chinese.hexdigest() # 进行加密获取加密后的结果
print("加盐后的密文:",md5_chinese_res) #打印加密后的密码
else:
md5_object = hashlib.md5()
md5_object.update(saltstr.encode('ascii')) #转为2进制
md5_result = md5_object.hexdigest() #获取加密结果
print("加盐后的密文:",md5_result) #打印加密后的密码
加密测试,需要输入要加密的对象和扰动字符
使用rcrack.exe对密文进行破译,发现没有破译成功。
2.迭代哈希实现
在进行哈希时,将哈希值反复作为输入进行多次哈希运算。在验证密码时,同样需要按照相同的迭代次数进行多次哈希运算,然后与存储的哈希值比较。
import hashlib
def is_chinese(input_string):
for char in input_string:
if not ('\u4e00' <= char <= '\u9fff'):
return False
return True
def iterated_hash(input_str, iterations=100000):
hash_object = hashlib.md5()
hash_object.update(input_str.encode('utf-8'))
for _ in range(iterations):
hash_object.update(hash_object.digest())
return hash_object.hexdigest()
input_str = input("请输入您需要加密的对象:")
iterations = 100000 # 设置迭代次数
if is_chinese(input_str):
hashed_result = iterated_hash(input_str)
print("使用迭代哈希加密后的密文是:", hashed_result)
else:
hash_object = hashlib.md5()
hash_object.update(input_str.encode('ascii'))
for _ in range(iterations):
hash_object.update(hash_object.digest())
hashed_result = hash_object.hexdigest()
print("使用迭代哈希加密后的密文是:", hashed_result)
加密测试
使用rcrack.exe对密文进行破译,发现没有破译成功
更多推荐
所有评论(0)