SHA算法分爲兩個分支:SHA-1和SHA-2,其中SHA-2包括SHA-224、SHA-256、SHA-384和SHA-512,SHA算法和MD算法類似,也是產生一個固定的散列碼。
SHA算法家族發展歷史
SHA算法被廣泛的認爲是MD5算法的繼任者,由美國國家安全局(NSA)設計,經過美國標準與技術研究院(NIST)發佈,發佈歷史比MD算法晚,相對安全:
- 1993年,NIST發佈SHA-0算法:FIPS PUB 180,SHA-0發佈不就即被NSA撤回,原因是不夠安全;
- 1995年,NIST發佈SHA-1算法:FIPS PUB 180-1,SHA-1算法被廣泛用在TLS/SSL(HTTPS)、PGP、SSH、S/MIME、IPsec。
- SHA-1可對最大長度在264字節的信息做摘要,產生160位信息,轉換爲16進製爲40位;
- SHA-1定義在RFC 3174中;
- 2002年,NIST發佈SHA-2算法:FIPS PUB 180-2,包含SHA-256、SHA-384、SHA-512算法;
- 2004年,NIST發佈SHA-2算法中的SHA-224,這是一個變種,主要是爲了配合產生符合3DES所需要的祕鑰長度而定義的算法;
應用場景
SHA算法的應用場景和MD算法應用場景類似,主要目的驗證信息完整性,防篡改,下表是不同的SHA算法產生的祕鑰的長度:
算法 | 產生的摘要長度 | 備註 |
---|---|---|
SHA-1 | 160 | JDK 6實現 |
SHA-256 | 256 | JDK 6實現 |
SHA-384 | 384 | JDK 6實現 |
SHA-512 | 512 | JDK 6實現 |
SHA-224 | 224 | Bouncy Castle實現,JDK不支持 |
Java中算法實現
SHA的算法調用和MD算法一樣,也是通過MessageDigest類完成,getInstance的時候傳入算法名稱即可,也可以使用DigestInputStream,代碼如下:
public class MD5Test {
public class MDInputStreamTest {
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
// 待做消息摘要操作的原始信息
byte[] input = "sha-256".getBytes();
// 初始化MesssageDigest對象,將使用MD5算法
MessageDigest md = MessageDigest.getInstance("SHA-256");
// 構建DigestInputStream對象
DigestInputStream in = new DigestInputStream(new ByteArrayInputStream(input), md);
try {// 每次讀取一段信息,計算MD5值,這裏可以分次讀取然後記錄每次的MD5
in.read(input, 0, input.length);
// 獲取摘要信息
byte[] rs = in.getMessageDigest().digest();
log(new String(HexBin.encode(rs)));
} finally {
in.close();
}
}
private static void log(String msg) {
System.out.println(msg);
}
}