Home » 你的密码安全吗?|区块链技术之哈希

你的密码安全吗?|区块链技术之哈希

今天是我们的区块链底层技术分享第一期——哈希。我们先不说哈希是什么,在你的生活中是不是存在以下的情况:

你在一个网站注册了账号,输了密码、身份证号、银行卡号,有没有担心过自己的敏感数据会被泄露呢?

 

你是一个互联网产品经理,当你跟程序员提需求的时候说:用户忘记密码时把密码原文通过邮件发给用户,程序员是这个表情:(产品经理风评被害

 

你是一个程序员领导告诉你,用户的敏感数据要进行哈希,你是不是这种心情:

 

其实这些都跟哈希函数的应用有关,并且存在于我们生活和工作的方方面面。但是当大家往往听到密码学、哈希这种词汇就觉得它很深奥,其实也没那么复杂,今天我们就分析一下。

01什么是哈希?

讲哈希的话,我们从用户密码存储方式的发展举例吧。

1.简单的密码存储

前几年我们经常会看到这样的新闻,“惊!某网站用户账号密码被泄露”等等。其实在互联网发展的初期,假设你在某网站注册完毕之后,用户名是:全村最帅的男人,密码是:123456;那么账号和密码基本上在后台的存储如下:这就是最早期的密码存储方式,用户密码在数据库中完全明文存储,黑客进了数据库之后,那么用户关联的所有信息都会被盗,用户信息毫无安全性可言。

2.经过升级的密码存储

哈希函数又称单向散列函数,请注意这个单向,很重要。单向表示什么意思?不可逆

先看哈希函数的定义:单向散列函数有一个输入和一个输出,输入的被称为消息,输出的被称为散列值(hash value)。

哈希函数有以下特点:

根据任意长度的消息计算出固定长度的散列值;能够快速计算出散列值;消息不同(也就是输入不同)得到的散列值也不同;具备单向性。单向性的意思是无法通过散列值推算出消息。哈希函数的特点怎么理解?还是用用户注册举例,

用户名是:全村最帅的男人,密码是:123456;用MD5散列函数哈希完之后的结果是:49ba59abbe56e057;那么这个时候在数据库中存储的数据为:通过图中可以看出,用户看到的密码是:123456,但是数据库中存储的是49ba59abbe56e057,所以程序员也是无法知道用户的密码是多少的,因为他们存储的是经过哈希后的散列值,当用户再次登录,输入密码,对密码再次进行哈希,对比哈希后的值和数据中存储的值是否一样,就能判断用户的密码是否正确了。

又因为哈希函数具有单向性,因此当用户忘记密码时,程序后台是无法通过49ba59abbe56e057计算出用户原本的密码123456的,也就是为什么现在登录网站忘记密码时只能重置。

同样黑客攻击也是同理,数据库被攻击了,黑客拿到的也只是密码的哈希值,根据哈希算法的特性,黑客是无法通过哈希值反推得到密码的,所以黑客攻破了数据库也没什么用。

 

黑客也不是吃素的,后来黑客发明了“彩虹表攻击(Rainbow Table Attack)”,使得攻击经过哈希算法加密的密码成为可能。(如果对彩虹表感兴趣,后台私信我,人数多的话再写一篇彩虹表文。)

3.再次升级的密码存储

事物的发展就是这样,攻防之间技术就进步了。为了应对彩虹表的攻击,技术大牛们发明了加“盐”的哈希算法。

 

盐(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。

具体就不讲加盐的过程了,只要记住加了盐之后的哈希值,被黑客攻击的难度更大了。

等等,说正事,我们今天要讲啥来着?哈希!那么什么是哈希,上面提到的MD5算法就是哈希函数的一种,那么区块链里面的哈希函数是什么呢?

02区块链里面的哈希函数

要介绍区块链里面的哈希函数,先了解常见的几种哈希函数。

1. MD4、MD5

MD4是由 Rivest 于1990年设计的单向散列函数,能够产生128比特的散列值( RFC1186, 修订版RFC1320)。不过,随着 Dobbertin 提出寻找MD4散列碰撞的方法,现在它已经不安全了。

MD5是由 Rivest 于1991年设计的单向散列函数,能够产生128比特的散列值(RFCI321)MD5的强抗碰撞性已经被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也已经不安全了。

MD4和MD5中的 MD 是消息摘要( Message Digest )的缩写。

2. SHA-1、SHA-256、SHA-384、SHA-512

SHA-1是由 NIST ( National Institute of Standards and Technology ,美国国家标准技术研究所)设计的一种能够产生160比特的散列值的单向散列函数。

1993年被作为美国联邦信息处理标准规格( FIPS PUB 180)发布的是 SHA ,1995年发布的修订版 FIPS PUB 180-1称为 SHA-1。在《 CRYPTREC 密码清单》中, SHA-1已经被列入“可谨慎运用的密码清单”,即除用于保持兼容性的目的以外,其他情况下都不推荐使用。

SHA -256、 SHA -384和 SHA-512都是由 NIST 设计的单向散列函数、它们的散列值长度分别为256比特、384比特和512比特。这些单向散列函数合起来统称 SHA-2,它们的消息长度也存在上限( SHA-256的上限接近于2^64比特, SHA-384和 SHA-512的上限接近于2^128比特)。这些单向散列函数是于2002年和 SHA-1一起作为 FIPS PUB 180-2发布的。

SHA-1的强抗碰撞性已于2005年被攻破(山东大学王小云教授),也就是说,现在已经能够产生具备相同散列值的两条不同的消息。

不过,目前SHA-2还尚未被攻破。

3. RIPEMD -160

RIPEMD-160是于1996年由 Hans Dobbertin 、 Antoon Bosselaers 和 Bart Preneel 设计的一种能够产生160比特的散列值的单向散列函数。

RIPEMD-160是欧盟 RIPE 项目所设计的 RIPEMD 单向散列函数的修订版。

这一系列的函数还包括 RIPEMD-128、 RIPEMD-256、 RIPEMD-320等其他—此版本。

在《 CRYPTREC 密码清单》中, RIPEMD-160已经被列入“可谨慎运用的密码清单”,即除了用于保持兼容性的目的以外,其他情况下都不推使用。

RIPEMD 的强抗碰撞性已经于2004年被攻破,但 RIPEMD-160还尚未被攻破。

比特币系统中用到了SHA -256和RIPEMD-160哈希算法,而莱特币是使用SCRYPT算法、以太坊中又不太一样,因此随着区块链技术的发展,在不同的应用中使用的哈希算法可能不尽相同。

OK,关于哈希函数的内容今天就分享这么多,密码学底层的数学知识深奥又有趣,但是考虑到我们公众号的读者从事不同行业,没有对底层的实现进行过多描述,如果大家对这些感兴趣,可以关注我们进一步讨论,我们下一期见~~

 

来源:百度作者:Candy链上笔记

发表评论

5 × 3 =