在加密安全领域中,如果不需要保证消息可以被完整的读取出来,只需要验证消息本身,则有消息摘要这类算法。摘要算法多用于信息的比对和验证,使得在不暴露原始信息,以及缩小比对量的情况下保证结果的正确性,这里涉及的算法包括:MAC、MD5、SHA1、SHA256等。
消息摘要算法
散列函数 Hash Function 又可称为散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数具有一个基本特性:如果两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果,而相应的散列函数即被称为单向散列函数。但是如果散列值相同,两个输入值可能相同也可能不同,这种情况成为散列碰撞。
密码散列函数 Cryptographic Hash Function 又可称为加密散列函数、密码散列函数,属于散列函数的一种,是一种单向函数,它将一个不定长的输入数据转换成固定大小的结果,并且以这个结果很难回推输入的数据。这种散列函数的输入数据,通常被称为消息Message,而输出的结果,经常被称为消息摘要Message Digest或摘要Digest。总的来说,密码散列函数具有如下的重要特征:
具有确定性,即同样的消息输入具有同样的散列结果
对于任何一个给定的消息,能够快速运算出散列数值
难以由一个已知的散列数值,去推算原始的消息
对于消息的任何微小的改动,都会导致散列结果的巨大改变
两个不同的消息输入,一定会产生不同的散列数值
除了被用作传统的哈希函数,而在数据索引、指纹等方面应用外,密码散列函数在信息安全方面有很多的应用,包括数字签名、消息认证码、以及各种形式的认证。
破解防范
密码只要存在一天,就会有被攻击破解的可能,而我们之前介绍了不同的加密算法,也需要根据不同的使用环境进行选择。下面举一些例子已经防范的措施:
暴力破解法 Brute-force attack 又可称为穷举法,即攻击者会系统性的尝试所有可能的密码,直到找到真正的密码为止。
破解防范:暴力破解的有效性取决于密码的长度、复杂度等,如果暴力破解的耗时过长,就会导致破解没有意义。与此相对应,为避免受到暴力破解的攻击,我们可以添加一些防护手段,比如:增加密码的长度与复杂度、在系统中限制密码试错的次数、定时修改密码等。
字典攻击防范比暴力破解优化点的一种方式叫做字典攻击Dictionary Attack,这种方法就是给密码锁定某个范围,比如英文单词、生日的数字组合等,所有的英文单词大约10万个左右,这样就可以大大缩小密码的查找范围,相比暴力破解可以缩短破译时间。
破解防范:字典攻击是根据现有或常用的组合测试破解密码,这就要求我们在设置相应的密码时要避免使用固定的单词和组合,应尽量使用无意思的字母数字符号组合在设置密码。
中间人攻击防范
中间人攻击 MITM Middle in the Middle Attack 是指攻击者秘密地传递并可能改变两方的通信,而通信双方仍然相信他们是直接通信的。
破解防范:为了抵御在不安全的通道的通信需求,我们需要一些抵御中间人攻击的一些认证技术方案:公钥基础建设PKI使用公认的数字证书认证机构CA认证通信端;延迟测试的预估时间的超出等。
碰撞攻击防范
碰撞攻击 Collision Attack 是指找出两个不同的输入值却导致同样的散列值的一种方式,目前已经可以有效地攻击MD5和SHA-1。
有效地利用碰撞,可以使得所有数据全部碰撞,人为的将哈希表变成一个退化的单链表,使得各种操作的时间均提升了一个数量级,因此大量消耗CPU资源,导致系统无法快速响应请求,从而达到拒绝服务供给Dos的目的。
破解防范:避免使用已被证明可以被有效攻击的算法,使用更高安全性的散列算法,比如SHA-2。
彩虹表防范
彩虹表 Rainbow Table 是一个用于加密散列函数逆运算的预先计算好的表,常用于破解加密过的密码散列。这种方式常用于包含有限字符固定长度纯文本密码的加密,是一种典型的以空间换时间的方式,相比暴力破解使用较少的计算能力而更多的存储空间。它可以针对各种散列算法,已被确认有效的包括MD5和SHA-1,一般主流的彩虹表都在100G以上。
破解防范:彩虹表是针对特定的算法,尤其是不对称算法,比如MD5,进行有效破解的一种方法。所以同样的,避免使用已被证明可以被有效攻击的算法,使用更高安全性的散列算法,比如SHA-2。
重放攻击防范
重放攻击 Replay Attack 是一种通过欺骗性的重复发送或者延迟有效消息的网络攻击手段。
破解防范:防止重放攻击的一个手段是在加密信息片段上附上会话ID和编号,使用这种唯一且随机的标签,使得攻击者不能简单的重放信息。其他的方法包括一次性密码、时间戳等。