英语原文共 5 页,剩余内容已隐藏,支付完成后下载完整资料
密码存储中MD5算法的安全性分析
摘要:散列算法通常用于将密码转换为散列,理论上这些散列不能被破译。 本文分析了哈希算法MD5在密码存储中的安全风险,并讨论了盐和迭代哈希等不同的解决方案。 我们提出了一种新的方法,通过在MD5计算之前使用外部信息,计算出的salt和一个随机密钥来加密密码,从而在密码存储中使用MD5。 我们建议使用密钥扩展来降低哈希计算速度,并使用XOR密码来使任何标准彩虹表中的最终哈希值无法找到。
关键词:组件;MD5;密码存储安全性;数据安全;字典攻击;彩虹表
一 介绍
随着计算机技术的出现,将信息存储在数据库中而不是存储在纸质文档中变得更加高效。 需要用户认证的Web应用程序通常通过将输入密码与通常存储在公司专用数据库中的真实密码进行比较来验证输入密码。 如果数据库以及这些密码被破坏,攻击者将无限制地访问这些用户的个人信息。 如今,数据库使用散列算法来保护存储的密码,但仍然存在安全漏洞。 最近在2012年,俄罗斯黑客从包括LinkedIn在内的知名社交网站发布了大量破解密码。 由于使用弱哈希算法,这些攻击被发现是成功的。
二 散列函数,哈希函数
散列函数是一种单向加密函数,它采用可变大小的输入明文并生成固定大小的散列输出。 破解散列在计算上很困难,任何破解散列的尝试都是不可行的。 “安全”散列函数应该能够抵抗映像前攻击和冲突攻击。 由于鸽子的原理和生日悖论,会有一些输入产生相同的散列结果。 输出长度为固定大小的128位,共计2128个可能的输出散列值。 这个值看起来很大,并不是无限的,因此导致了碰撞。
MD5算法
MD5(消息摘要算法5)由Ron Rivest于1991年设计.MD5将可变长度消息处理成128位的固定长度输出。 MD5是一种流行的散列函数。 它工作在512位的块上,每个块处理4轮,每轮处理16个子块(每个32位)。 在处理之前,512位消息被分成16个子块。 如果一个消息块不是最多512位,它将被填充,如图1所示。该算法的详细解释可以在[1]中找到。
图1 填充后的消息长度(以位为单位)
三 MD5算法在密码存储安全中的应用
将密码以明文形式存储在数据库中是非常不安全的。 为了增加密码的安全性,可以使用MD5算法来散列原始密码和散列值,而不是将明文存储在数据库中。 在身份验证期间,输入密码也以类似的方式由MD5散列,并将结果散列值与数据库中该散列值进行比较以确定该特定用户。
散列算法(Hash Function)中,最为常用的是MD5(Message-Digest Algorithm 5)算法,MD5是一个较为古老的算法,一度被广泛应用于安全领域。比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。
通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。
不过,由于MD5的弱点被不断发现以及计算机能力不断的提升,通过碰撞的方法有可能构造两个具有相同MD5的信息,使MD5算法在目前的安全环境下有一点落伍。从实践角度,不同信息具有相同MD5的可能性还是非常低的,通常认为是不可能的,通过碰撞的方法也很难碰撞出复杂信息的MD5数值。
四 MD5的安全性分析
MD5算法容易出现两种主要类型的攻击:字典攻击和彩虹表。
A.字典攻击
在字典式攻击中,攻击者在称为字典的详尽列表中尝试所有可能的密码。 攻击者对字典中的每个密码进行散列处理,并对被泄露的哈希密码执行二进制搜索。 通过预先计算这些可能的密码的哈希值并将它们存储在哈希表中,可以使此方法更快。
B.彩虹桌
Rainbow表由散列链组成,并且比散列表更有效,因为它们优化了存储需求,尽管查找速度稍慢。彩虹表与哈希表的不同之处在于,它们是使用约简和散列函数创建的。简化函数将散列值转换为纯文本。明文不是从中生成散列值的原始明文,而是另一个明文。通过交替散列函数和简化函数,形成交替密码和散列值的链。只有生成的第一个(链的起点)和最后一个明文(链的终点)存储在表中。为了破译哈希密码,我们首先通过简化函数处理哈希密码,直到找到与链的端点匹配的为止。然后我们获取该链的相应起点并重新生成散列链,并找到散列密码的原始明文。彩虹表现在很容易在网上提供。有很多密码破解系统和使用彩虹表的网站,例如OphCrack。当然,使用彩虹表并不能保证破解密码系统的成功率达到100%。但是,用于创建彩虹表的字符集越大,哈希链长度越长,彩虹表就越大。
五 对策研究
A.信息熵
密码强度通常用信息熵来衡量。 简而言之,信息熵越高,密码越强,因此破解密码越困难。 6个字符的密码只需要26次尝试就可以用尽暴力攻击的所有可能性,而42个字符的密码则需要242次尝试。 可以看出,密码越长,从中得到的字符集越大,密码越强。 根据最佳实践和初步要求,应用程序应坚持在注册过程中用户使用强密码。 强密码在字典中存在的风险较小。 常见的简单密码,如“123456”已被微软Hotmail禁止。
B.Salting
成功进行密码破解攻击的最常见原因之一,就像是针对LinkedIn的密码破解攻击的原因是因为他们使用的是未加密的哈希。 这使黑客更容易通过使用彩虹表来破解系统,尤其是考虑到许多用户使用非常普通的简单密码,并且这些相似的密码导致类似的哈希。 盐是由一系列字符组成的辅助信息,这些字符被附加到明文并散列。 咸味使密码对彩虹桌更具抵抗力,因为盐渍散列密码具有较高的信息熵,因此在预先计算的彩虹桌中不太可能存在。 通常,一个盐应该至少有48位。 盐可以通过以下方式实施:
1)所有密码均为单盐:鉴于盐份足够长且复杂,一个标准的彩虹桌不能用来破译盐渍的哈希。 但是,两个相同的密码仍然会产生相同的散列。
- 为每个密码设置不同的随机盐并将盐存储在数据库本身中:如果我们对每个密码使用不同的盐,则两个相同的密码将具有不同的哈希值。 攻击者必须为每个单独的用户生成不同的彩虹表,从而使攻击者在计算上难以破解哈希。 这些盐可以以明文存储在数据库中。 盐的目的不是保密,而是足够随机,以打败彩虹桌的使用。
- 使用现有的列值:可以使用像username这样的现有列值作为salt。 该解决方案与上面讨论的第二种解决方案类似。 它破坏了标准彩虹表的使用,但黑客可能会为特定用户名生成彩虹表,例如“root”或“admin”。
- 使用位置可变的计算盐:盐的位置可以是前缀(在密码前加盐),中缀(在密码中加盐)或后缀(在密码末尾加盐)。 如果盐的位置是随机的,那么破解密码变得更加困难。 例如,我们可以将盐的位置设置为等于密码长度的模数.盐可以通过使用随机字符序列(存储在数据库中)和其他字符(嵌入代码中)来计算。 例如,可以将盐制成用户名的前两个字母,字符的随机序列和用户名的最后两个字母的组合.
- 使用可变位置的计算盐,包括数据库外的信息和应用程序代码:黑客现在必须闯入数据库和包含应用程序代码的服务器。 他还需要获取破解密码所需的附加信息。
C.MD5加工的改进
以下方法可用于改进MD5处理:
- 改进的哈希函数:哈希计算函数被更改,例如使用以下函数之一,如(1)、(2)和(3)中所示:
hash = Hash (password salt) |
(1) |
hash = Hash (Hash (password) salt) |
(2) |
hash = Hash (password salt key) |
(3) |
- 迭代散列:密码被散列多次。 MD5是一种快速哈希函数,即计算速度快。 迭代散列使计算速度变慢,因此计算速度更慢,更难以破解。 通常可以使迭代次数等于1000次。
- 密钥扩展:通过使攻击工作量更大,这使密码更能抵抗预计算攻击。 使用迭代散列,其中将弱密钥馈送到散列算法,并且输出产生更强的密钥。 根据用于迭代哈希的输入,有3个关键拉伸方法:
a)简单密钥扩展:只有密钥被迭代散列,如(4)所示。 不涉及盐。
key = Hash (key) |
(4) |
b)密码键拉伸:密码和密钥都在循环中使用。
c)盐渍键拉伸:在循环中使用键,密码和盐。 这种方法是三种关键拉伸方法中最好的。
- 在哈希之前转换密码:在计算密码的MD5哈希之前,后者使用简单的密码方法进行转换。
- 链接方法和XOR(异或)密码:如果使用迭代哈希,则来自当前迭代的哈希输出用于下一次迭代的输入。 我们使用一个简单的XOR密码通过对所有迭代中的散列输出值进行“异或”来计算最终的散列值。 一个简单的XOR密码通常采用(5)所示的形式。 如果密钥足够随机,密文几乎不可能破解。
plaintext XOR key = ciphertext |
(5) |
D.改进的MD5处理示例
现在我们将演示如何使用MD5的改进版本对数据库中的密码进行哈希处理。涉及五个主要步骤。
首先,首先产生随机长度的随机密钥串。它的字符集是{0-9,a-z,A-Z}。该随机密钥字符串用于生成复杂密码,并且还存储在数据库中供以后在密码验证期间使用。
其次,通过列转置密码将密码转换成复杂的密码。假设随机密钥是“YDCiA”,密码是“疯狂的”,密码首先被转换成5列的矩阵(与随机密钥的长度相同),空白单元格交替填充“*”和“@” “,如图2所示。使用列转换密码,生成的复杂密码是“ya * ac * ridcrrzh @”。
再次,通过逐行查找具有复杂密码的随机密钥串的XOR值来计算盐。在我们的例子中,salt是“%i \ b \”s6 * \ r \“”。
图2.通过列转换生成复杂密码
第四,为每个用户生成128位的附加随机信息串并存储在外部文件中,例如, 在闪存驱动器。
最后,使用基于密钥扩展的公式对密码进行散列。 散列过程类似于密码块链接方法,其中一轮的输出用于另一轮的输入,如图3所示。通过计算一个散列值与一个散列值的异或结果 在前一轮,在任何标准彩虹表中都无法找到产生的散列值。
最终散列密码然后存储在数据库中。 系统通过计算散列值(从数据库中检索随机密钥以供使用)来认证用户,然后将其与存储的散列密码进行比较。 图4显示了哈希密码将如何出现在数据库中的一个例子。
finalHash = HV0 ^ HV1 ^ ...... ^ HVN,
HV0 =散列(CpxPassword,additionalInfo);
HV1 =散列(CpxPassword,HV0,salt);
HVN =散列(CpxPassword,HVN-1,盐);
N是迭代次数,^是XOR。
HV:哈希值和
CpxPassword:复杂密码
图3.使用改进的MD5的数据库中散列密码的示例
图4.使用改进的MD5的数据库中的散列密码示例
整个算法可以总结在图5中。这里使用的初始化向量是附加信息,它是128位的随机字符串。 每个用户都有不同的初始化向量值。
图5.改进的MD5处理(IV:初始化向量)
六 性能分析
首先,使用标准彩虹表的攻击会失败,因为存储在数据库中的散列密码不是十六进制形式,因此在任何标准彩虹表中都不存在。我们尝试了一些在线MD5解密工具,例如http://www.md5decrypter.co.uk/和下载的软件工具如Cain和Abel。但是,由于它们都使用彩虹表,其中MD5哈希是十六进制格式,而我们存储的哈希值是ASCII,所以攻击从头开始已经失败,如图6所示。
另外,通过异或来自每次迭代的输出哈希值,几乎不可能在第一轮中找出原始哈希输出。一般来说,如果我们用密钥对明文进行异或运算以计算密文,我们可以简单地通过将密文与密钥进行异或运算来得到明文。但是,如果密钥是随机的,那么几乎不可能找回明文。在我们的例子中,密钥是完全随机的,因为我们正在散列中间散列输出值,因此给出最终的散列值,所以不可能破译它。 <!--
全文共6369字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[14692],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。
您可能感兴趣的文章
- 拟人手臂的轨迹规划与轨迹跟踪控制外文翻译资料
- 新型磁性辅助内窥镜系统在上消化道检查中应用的可行性 和安全性外文翻译资料
- 基于FPGA可编程逻辑器件的复合视频图像处理外文翻译资料
- 从被测的高频域原始信号中提取巴克豪森噪声外文翻译资料
- 重型机床z轴热误差混合建模方法外文翻译资料
- 一个红外浊度传感器:设计与应用外文翻译资料
- 用于控制食物烹饪过程的电子系统.外文翻译资料
- 关于液体介质中电磁流量计的设计和理论上存在的问题。第二部分:关于带电粒子产生的 噪声理论外文翻译资料
- 基于LabVIEW和Matlab的小波变换对非平稳信号的分析仿真外文翻译资料
- 应用于腹腔镜手术的新型膜式加热加湿器 的开发外文翻译资料