信息摘要技術 - SHA系列

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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章