一. 简介
SHA
家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。
SHA-1,哈希(Hash)算法,一个非常流行的加密散列函数。在许多安全协议中广为使用,通常被用做密码加密,文件校验等,曾被视为MD5的后继者,且存在不可逆性.(和MD5同为MD4导出,所以具备一定的相似性)
这个算法的思想是输入长度不限的明文,产出一个160位的信息摘要(比MD5多出32位).也是会压缩原来的内容,输出固定长度的散列值.在一定的强度上,它比MD5的强度更高.
二. 破解
早在05年的时候,我国的王小云教授成功的提出了MD5成功碰撞.(不同的原始数据得到相同的密文),继而又提出了sha1的碰撞,可是并无实例.
在2017年,谷歌成功的对sha1进行了碰撞,当时震动了世界,也就是说sha1算法不再那么安全.
其成功碰撞,能使用两个不同的原始数据得到相同的摘要.这个时候,如果有恶意攻击者使用这种冲突,用恶意文件来替换掉安全文件,而接收者通过相同的信息摘要,并不能识别出来文件的性质,可能造成严重的后果.
但是对于sha1的破解难度还是有一定的难度,需要相当的条件才能有具备这个能力.
下面的列出了一些数字,让大家了解破解这种算法所需要的计算规模有多大:
总计900万兆(即百万的五次幂,具体为9,223,372,036,854,775,808)次SHA1计算。
要完成攻击的首个阶段需要单一CPU计算6500年。
要完成攻击的第二阶段需要单一GPU计算110年。
md5:只需要一个智能手机30秒就破解了。
sha-1 shattered:110GPU 需要一年;
sha-1 bruteforce:12000000GPU 需要一年。
总之,就是也就只有谷歌这些云计算基础设施才能搞得定,不是谁都可以.而且后面还有更为安全的sha2算法.
所以从2017年1月发布的第56版开始,Chrome会将任何受SHA-1证书保护的网站视为不安全。 Firefox已计划于2017年初推出此功能,已于2017年2月24日淘汰了SHA-1。
三. 前端应用
1.crypto-js
功能强大,不止处理MD5,支持的模块非常多,star数目前6k+,前后端可用.
//后端 npm包管理
npm install crypto-js
import sha256 from 'crypto-js/sha256';
import hmacSHA512 from 'crypto-js/hmac-sha512';
import Base64 from 'crypto-js/enc-base64';
const message, nonce, path, privateKey; // ...
const hashDigest = sha256(nonce + message);
const hmacDigest = Base64.stringify(hmacSHA512(path + hashDigest, privateKey));
//前端 Brower管理
bower install crypto-js
2.jsSHA
专注处理sha加密,目前star数1k+.能够处理sha家族(SHA-1,SHA-224,SHA3-224,SHA-256,SHA3-256,SHA-384,SHA3-384,SHA-512,SHA3-512,SHAKE128 ,和SHAKE256以及HMAC)
使用所需的哈希类型,输入类型和选项作为参数实例化新的jsSHA对象。哈希类型可以是SHA-1,SHA-224,SHA3-224,SHA-256,SHA3-256,SHA-384,SHA3-384,SHA-512,SHA3-512,SHAKE128或SHAKE256之一。输入类型可以是HEX,TEXT,B64,BYTES或ARRAYBUFFER之一。然后,您可以使用update对象函数对输入进行流式处理,如果需要,可以多次调用它。最后,只需getHash使用输出类型作为参数调用(B64,HEX,BYTES或ARRAYBUFFER)。
npm install jssha
//引用
jsSHA = require("jssha");
//使用
var shaObj = new jsSHA("SHA-512", "TEXT");
shaObj.update("This is a ");
shaObj.update("test");
var hash = shaObj.getHash("HEX");