加密算法之SHA(SHA1、SHA256)
前言
? ? ? ? 本章講解典型的加密算法SHA(SHA1、SHA256)
方法
1、概念
????????安全散列算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個密碼散列函數(shù)家族,是FIPS所認(rèn)證的安全散列算法。能計算出一個數(shù)字消息所對應(yīng)到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應(yīng)到不同字符串的機(jī)率很高。
????????SHA1(英語:Secure Hash Algorithm 1,中文名:安全散列算法1)是一種密碼散列函數(shù),美國國家安全局設(shè)計,并由美國國家標(biāo)準(zhǔn)技術(shù)研究所(NIST)發(fā)布為聯(lián)邦數(shù)據(jù)處理標(biāo)準(zhǔn)(FIPS)。SHA-1可以生成一個被稱為消息摘要的160位(20字節(jié))散列值,散列值通常的呈現(xiàn)形式為40個十六進(jìn)制數(shù)。
????????SHA256是SHA2的一種,可產(chǎn)生256位的哈希值,較SHA1更加的安全。
2、SHA1加密原理
????????我們?nèi)匀灰詥卧~ China 為例,如何將其進(jìn)行MD5加密呢?
????????第一步:首先將China單詞轉(zhuǎn)化為ASCII碼的十六進(jìn)制表示方式
China的十六進(jìn)制為:43 68 69 6E 61
????????第二步:對得到的數(shù)據(jù)??4368696E61 進(jìn)行填充和附加,使其能夠被512整除。
????????對于任意長度的明文,SHA1的明文分組過程與MD5相類似,首先需要對明文添加位數(shù),使明文總長度為448(mod512)位。在明文后添加位的方法是第一個添加位是l,其余都是0。然后將真正明文的長度(沒有添加位以前的明文長度)以64位表示,附加于前面已添加過位的明文后,此時的明文長度正好是512位的倍數(shù)。與MD5不同的是SHA1的原始報文長度不能超過2的64次方,另外SHA1的明文長度從低位開始填充。
????????第三步:將得到數(shù)據(jù)進(jìn)行拆分,按照512位分塊。SHA1有4輪運算,每一輪包括20個步驟(一共80步),最后產(chǎn)生160位摘要。
3、注意事項
? ? ? ? 與MD5相比,SHA1有以下優(yōu)缺點:
????????最顯著和最重要的區(qū)別是SHA1摘要比MD5摘要長32 位。使用強(qiáng)行技術(shù),產(chǎn)生任何一個報文使其摘要等于給定報摘要的難度對MD5是2^128數(shù)量級的操作,而對SHA1則是2^160數(shù)量級的操作。這樣,SHA1對強(qiáng)行攻擊有更大的強(qiáng)度。相對的在相同的硬件上,SHA1的運行速度比MD5慢。
? ? ? ? 但是就目前的情況來看,SHA1也很容易被攻破,為了安全起見,可以選擇諸如SHA256,SHA512等高強(qiáng)度的算法來提升安全性。
4、Java實現(xiàn)SHA1加密
package cn.edu.ccut;import java.security.MessageDigest;public class SHA1Test {public static String shaEncode(String inStr) throws Exception {MessageDigest sha = null;try {sha = MessageDigest.getInstance("SHA");} catch (Exception e) {System.out.println(e.toString());e.printStackTrace();return "";}byte[] byteArray = inStr.getBytes("UTF-8");byte[] md5Bytes = sha.digest(byteArray);StringBuffer hexValue = new StringBuffer();for (int i = 0; i < md5Bytes.length; i++) {int val = ((int) md5Bytes[i]) & 0xff;if (val < 16) {hexValue.append("0");}hexValue.append(Integer.toHexString(val));}return hexValue.toString();}public static void main(String args[]) throws Exception {String str = "China";System.out.println("SHA1加密前:" + str);System.out.println("SHA1加密后:" + shaEncode(str));} }運行結(jié)果如下:
?
總結(jié)
以上是生活随笔為你收集整理的加密算法之SHA(SHA1、SHA256)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UE4 Geometry Polygon
- 下一篇: hex文件解析