一. 简介
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”);