We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。[1]好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
如今,散列算法也被用来加密存在数据库中的密码(password)字符串,由于散列算法所计算出来的散列值(Hash Value)具有不可逆(无法逆向演算回原本的数值)的性质,因此可有效的保护密码。
如果两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的;
散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同;
不能通过结果推导输入;
输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值;
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm)
一种被广泛使用的密码散列函数,可以产生出一个128位(16个字符(BYTES))的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 中被加以规范
1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的资料,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞攻击(英语:Collision_attack),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的几率很高。
SHA家族的算法,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,是美国的政府标准,其分别是:
SHA-0:1993年发布,当时称做安全散列标准(Secure Hash Standard),发布之后很快就被NSA撤回,是SHA-1的前身。 SHA-1:1995年发布,SHA-1在许多安全协议中广为使用,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后继者。但SHA-1的安全性在2010年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1[1]。 SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。SHA-2目前没有出现明显的弱点。虽然至今尚未出现对SHA-2有效的攻击,但它的算法跟SHA-1基本上仍然相似。 SHA-3:2015年正式发布,由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的SHA-3。
对比来说 MD5 有更高的性能,但是安全性不足(可被破解),SHA 具有更高的安全性
两者适应场景不同,在日常开发中都有相对应的应用
在文件传输时,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件。
这种场景,对hash碰撞的要求要低于计算的速度,因为文件较大时,计算的速度会更重要。
在密码学中,hash算法的作用主要是用于消息摘要(Message Digest),它主要用于对整个消息的完整性进行校验。举个例子,我们登陆B站的时都需要输入密码,那么B站的数据库会保存明文的密码吗?如果会明文保存,B站的DBA肯定会看到每个人的密码是什么,很不安全;同时如果用户在注册登录时也是明文在网络上传输账号密码,这个信息也会被人恶意截取,都会有很多安全问题。
通常一个系统都不会明文存储用户的密码,一般,用户在注册的时候,密码在用户侧还未提交时,就会使用密码的明文计算一个hash值,然后传输到后端系统,并将密文记录到数据库中,用户登录时,在用户侧在使用相同的算法对密码计算一个hash值,传到后端后,将这个hash值和数据库中的hash值进行比较,如果相同就登录成功;这样就避免了在网络传输或公司的DBA泄露用户密码,而且密码始终是在用户侧,所以只要用户知道密码的明文是什么。
在这些应用场景里,对于抗碰撞和抗篡改能力要求较高,对速度的要求在其次。一个设计良好的hash算法,其抗碰撞能力是很高的。以MD5为例,其输出长度为128位,碰撞的概率是2的128次方分之一。
在用到hash进行管理的数据结构中,就对速度比较重视,对抗碰撞不太看中,只要保证hash均匀分布就可以。比如Hashmap,hash值(key)存在的目的是加速键值对的查找,key的作用是为了将元素适当地放在各个桶里,对于抗碰撞的要求没有那么高。换句话说,hash出来的key,只要保证value大致均匀的放在不同的桶里就可以了。但整个算法的set性能,直接与hash值产生的速度有关,所以这时候的hash值的产生速度就尤为重要:
The text was updated successfully, but these errors were encountered:
No branches or pull requests
定义
散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。[1]好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。
如今,散列算法也被用来加密存在数据库中的密码(password)字符串,由于散列算法所计算出来的散列值(Hash Value)具有不可逆(无法逆向演算回原本的数值)的性质,因此可有效的保护密码。
特性
确定性
如果两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的;
冲突(碰撞)
散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同;
不可逆性
不能通过结果推导输入;
混淆性
输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值;
常用散列算法
MD5
一种被广泛使用的密码散列函数,可以产生出一个128位(16个字符(BYTES))的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 中被加以规范
1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的资料,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞攻击(英语:Collision_attack),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途
SHA家族
SHA家族的算法,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,是美国的政府标准,其分别是:
SHA-0:1993年发布,当时称做安全散列标准(Secure Hash Standard),发布之后很快就被NSA撤回,是SHA-1的前身。
SHA-1:1995年发布,SHA-1在许多安全协议中广为使用,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后继者。但SHA-1的安全性在2010年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1[1]。
SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。SHA-2目前没有出现明显的弱点。虽然至今尚未出现对SHA-2有效的攻击,但它的算法跟SHA-1基本上仍然相似。
SHA-3:2015年正式发布,由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的SHA-3。
对比
对比来说 MD5 有更高的性能,但是安全性不足(可被破解),SHA 具有更高的安全性
两者适应场景不同,在日常开发中都有相对应的应用
应用
文件传输
在文件传输时,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件。
这种场景,对hash碰撞的要求要低于计算的速度,因为文件较大时,计算的速度会更重要。
消息摘要
在密码学中,hash算法的作用主要是用于消息摘要(Message Digest),它主要用于对整个消息的完整性进行校验。举个例子,我们登陆B站的时都需要输入密码,那么B站的数据库会保存明文的密码吗?如果会明文保存,B站的DBA肯定会看到每个人的密码是什么,很不安全;同时如果用户在注册登录时也是明文在网络上传输账号密码,这个信息也会被人恶意截取,都会有很多安全问题。
通常一个系统都不会明文存储用户的密码,一般,用户在注册的时候,密码在用户侧还未提交时,就会使用密码的明文计算一个hash值,然后传输到后端系统,并将密文记录到数据库中,用户登录时,在用户侧在使用相同的算法对密码计算一个hash值,传到后端后,将这个hash值和数据库中的hash值进行比较,如果相同就登录成功;这样就避免了在网络传输或公司的DBA泄露用户密码,而且密码始终是在用户侧,所以只要用户知道密码的明文是什么。
在这些应用场景里,对于抗碰撞和抗篡改能力要求较高,对速度的要求在其次。一个设计良好的hash算法,其抗碰撞能力是很高的。以MD5为例,其输出长度为128位,碰撞的概率是2的128次方分之一。
数据结构
在用到hash进行管理的数据结构中,就对速度比较重视,对抗碰撞不太看中,只要保证hash均匀分布就可以。比如Hashmap,hash值(key)存在的目的是加速键值对的查找,key的作用是为了将元素适当地放在各个桶里,对于抗碰撞的要求没有那么高。换句话说,hash出来的key,只要保证value大致均匀的放在不同的桶里就可以了。但整个算法的set性能,直接与hash值产生的速度有关,所以这时候的hash值的产生速度就尤为重要:
The text was updated successfully, but these errors were encountered: