Python工具箱系列(十七)

很多软件工程师都认为MD5是一种加密算法,然而这种观点是不对的。作为一个 1992 年第一次被公开的算法,到今天为止已经被发现了一些致命的漏洞。本文讨论MD5在密码保存方面的一些问题。

假设下面一个场景:

 

  • 软件产品让用户输入用户名与口令,随即使用MD5算法将口令(明文)转变成为摘要值。

  • 用户登录时,用户输入的口令,也使用MD5进行计算,然后与存储的MD5进行比较,如果相同,则用户成功登录。

  • 由于没有存储口令的原始值,所以即使相关人员(工程师、运维人员、黑客)获得了口令的MD5值,根据算法的特性,也无法知道原始的口令内容。

  • 正是算法的不可逆性,因为口令只能够重新生成,而系统无法反馈原始的口令是什么。

以上场景是非常完美的。但是由于人类的弱点,大部分人会选择非常简单易记,或者有特殊意义的字符串做为口令。攻击者只需要将一些常见密码提前计算一下哈希就可以找到数据库中很多用于存储的密码,Wikipedia 上有一份关于最常见密码的列表,在2016年的统计中发现使用情况最多的前25个密码占了调查总数的10%,虽然这不能排除统计本身的不准确因素,但是也足以说明仅仅使用哈希的方式存储密码是不够安全的。提前计算的HASH表称为彩虹表,存储着一些常见密码的哈希,当攻击者通过入侵拿到某些网站的数据库之后就可以通过预计算表中存储的映射来查找原始密码如下图所示。

Python工具箱系列(十七)

为了抵抗上述的暴力方法,可以使用md5加盐的策略,进一步强化md5暴力破解的难度。在上世纪70到80年代,早期版本的Unix系统就在/etc/passwrd中存储加盐的哈希密码,密码加盐后的哈希与盐会被一起存储在/etc/passwd文件中,今天哈希加盐的策略与几十年前的也没有太多的不同,差异可能在于盐的生成和选择。一个示范性质的代码如下所示。

from random import Random
from hashlib import md5

# 获取由4位随机大小写字母、数字组成的salt值
def create_salt(length=4):
    salt = ''
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789&#39'
    len_chars = len(chars) - 1
    random = Random()
    for i in range(length):
        # 每次从chars中随机取一位
        salt += chars[random.randint(0, len_chars)]
    return salt

# 获取原始密码+SALT,计算返回MD5值
def create_md5(pwd, salt):
    md5_obj = md5()
    inputstr = pwd+salt
    md5_obj.update(inputstr.encode(encoding='utf-8'))
    return md5_obj.hexdigest()

pwd = '123456'
salt = create_salt()
finalmd5 = create_md5(pwd,salt)
print(f'pwd:{pwd},salt:{salt},md5:{finalmd5}')

执行后的效果如下所示:

pwd:123456,salt:lhDy,md5:e7a2a020e5738dc9cc7822ca11b6fdf7

在实际使用时,需要保存salt的值与计算结果。加盐的方式主要还是为了增加攻击者的计算成本,当攻击者顺利拿到数据库中的数据时,由于每个密码都使用了随机的盐进行哈希,所以预先计算的彩虹表就没有办法立刻破译出哈希之前的原始数据,攻击者对每一个哈希都需要单独进行计算,这样能够增加了攻击者的成本,减少原始密码被大范围破译的可能性。但这个貌似完美的策略还是被发现存在问题。因为一个哈希函数或者摘要算法被找到哈希碰撞的概率决定了该算法的安全性,早在几十年前,人们就在MD5的设计中发现了缺陷并且在随后的发展中找到了低成本快速制造哈希碰撞的方法:

  • 1996年《The Status of MD5 After a Recent Attack》——发现了MD5设计中的缺陷,但是并没有被认为是致命的缺点,密码学专家开始推荐使用其他的摘要算法;

  • 2004年《How to Break MD5 and Other Hash Functions》——发现了MD5摘要算法不能抵抗哈希碰撞,我们不能在数字安全领域使用MD5算法;

  • 2006年《A Study of the MD5 Attacks: Insights and Improvements》——创建一组具有相同MD5摘要的文件;

  • 2008年《MD5 considered harmful today》——创建伪造的SSL证书;

  • 2010年《MD5 vulnerable to collision attacks》——CMU软件工程机构认为MD5摘要算法已经在密码学上被破译并且不适合使用;

  • 2012年《Flame》——恶意软件利用了MD5的漏洞并伪造了微软的数字签名

总结一下,之所以基于MD5的密码保存与对比策略不安全是因为:

  • 实际应用的大量口令本身很简单;

  • MD5计算起来非常快,攻击者今天可以通过 GPU 每秒执行上亿次的计算来破解用户的密码;

  • 算法自身的缺陷。

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python工具箱系列(十七) - Python技术站

(0)
上一篇 2023年4月2日 下午4:21
下一篇 2023年4月2日 下午4:21

相关文章

  • Python工具箱系列(二十)

    数据库操作应是所有合格程序员的基本功,写的一手好SQL对于数据分析师而言更是安身立命之本。大部分软件开发人员使用的数据库都是MySql/MariaDB,毕竟LAMP(linux+apache+mysql+php)曾经风靡一时。但开发人员真正的瑞士小军刀却是SQLite,它是世界上装机量第一的嵌入式数据库。 SQLite最初的构思是在一条军舰上进行的。当时在通…

    2023年4月2日
    00
  • Python工具箱系列(二十六)

    ClickHouse(Click Stream,Data WareHouse)是俄罗斯的 Yandex于2016年开源的用于在线分析处理查询(OLAP:Online Analytical Processing)MPP架构的列式存储数据库(DBMS:Database Management System),能够使用 SQL 查询实时生成分析数据报告。特别值得称道…

    Python开发 2023年3月31日
    00
  • Python工具箱系列(三十一)

    Neo4j是一个高性能的开源的,使用Java语言实现的NoSQL图数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。现实中很多数据都是用图来表达的,比如社交…

    python 2023年5月11日
    00
  • Python工具箱系列(二十一)

    准备数据 为了方便准备试验用的数据,建议使用Faker这个库来模拟。Faker是一个Python软件包,可生成伪造数据。无论是需要引导数据库,创建美观的XML文档,填充持久性以进行压力测试,还是匿名化来自生产服务的数据,Faker都能完美实现。 pip install faker 以下代码生成姓名、性别这类最常用的试验数据。 from faker impor…

    Python开发 2023年3月31日
    00
  • Python工具箱系列(八)

    前面我们提到过,有以下工具都可以开发Python代码: 直接使用Python解释器。运行Python就可以得到一个交互式命令行界面,可以简单的测试代码。作为Python入门,写代码不超过10行,完全可用。如果想开发大型代码,这个真心很难用。 使用IPython,也是命令行界面,但内置非常方便的各种宏与功能。比单纯的Python交互界面强太多。在某些情况下,例…

    2023年4月2日
    00
  • Python工具箱系列(十六)

    前面介绍了对称加密算法,本文将介绍密码学中另一类重要应用:消息摘要(Digest),什么是消息摘要?简单的定义是:对一份数据,进行一个单向的Hash函数,生成一个固定长度的Hash值,这个值就是这份数据的摘要,也称为指纹。 常见的摘要算法有: MD5 SHA1 SHA256 其它 特点如下:   无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如…

    Python开发 2023年4月2日
    00
  • Python工具箱系列(三十)

    PostgreSQL MySQL的口号是“世界上最流行的开源关系型数据库”,而PostgreSQL的Slogan则是“世界上最先进的开源关系型数据库(PostgreSQL: The World’s Most Advanced Open Source Relational Database)”,一看这就是一对老冤家了。这两个口号很好的反映出了两者的形象特质:P…

    python 2023年5月8日
    00
  • Python工具箱系列(二十四)

    不管多少人黑微软,微软出品的大多数产品都能够深入人心,成为精品。在数据库领域,微软为专业人士提供SQL Server(简称mssql)。为日常办公人士提供Access与Excel这两款数据存储与分析的神器。 SQL Server是微软在数据库领域打造的旗舰产品,使用起来安全、稳定、可靠,并且对于SQL语言的语法与特性支持的非常好。长期以来由于微软敌视开源运动…

    2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部