MD5 SHA-1 示例

时间:2022-04-21 15:51:40

测试代码

public class SignatureUtils {
    public static void main(String[] args) throws Exception {
        //测试获取字符串的签名
        System.out.println("字符串1的MD5签名为【" + getStrMessageDigest("1", "MD5") + "】");//【C4CA4238A0B923820DCC509A6F75849B】
        System.out.println("字符串1的SHA1签名为【" + getStrMessageDigest("1", "SHA-1") + "】\n");//【356A192B7913B04C54574D18C28D46E6395428AB】
        //测试获取文件的签名
        System.out.println("下面是两个不同的文件,但是它们的 MD5 都是一样的,这就是科学家通过碰撞破解签名的案例");
        File file1 = new File("E:/HelloWorld-colliding.exe");
        File file2 = new File("E:/GoodbyeWorld-colliding.exe");
        System.out.println("文件1的MD5签名为【" + getFileMessageDigest(file1, "MD5") + "】");//【18FCC4334F44FED60718E7DACD82DDDF】
        System.out.println("文件2的MD5签名为【" + getFileMessageDigest(file2, "MD5") + "】");//【18FCC4334F44FED60718E7DACD82DDDF】
        System.out.println("文件1的SHA1签名为【" + getFileMessageDigest(file1, "SHA-1") + "】");//【0033F995A30FD2CCBF60CC1E7D7DB9E649397668】
        System.out.println("文件2的SHA1签名为【" + getFileMessageDigest(file2, "SHA-1") + "】\n");//【30ACE7E13A7F9DC9ABBAA431241309AC6741E735】
        //获取所有支持的签名算法
        showAllAalogrithm();
    }
    /***
     * 获取所有支持的签名算法
     */
    public static void showAllAalogrithm() {
        System.out.println("所有支持的签名算法");
        Provider[] providers = Security.getProviders();//获取已注册提供者列表
        for (Provider provider : providers) {
            Set<Service> services = provider.getServices();//返回封装取自第一个 Provider支持的算法
            System.out.print(provider.getName() + "\n    ");
            for (Service service : services) {
                System.out.print("【" + service.getAlgorithm() + "】");
            }
            System.out.println();
        }
        //【SHA1PRNG】【SHA1withDSA】【NONEwithDSA】【SHA224withDSA】【SHA256withDSA】【DSA】【MD2】
        //【MD5】【SHA】【SHA-224】【SHA-256】【SHA-384】【SHA-512】【DSA】【DSA】【DSA】【X.509】【JKS】【CaseExactJKS】
        //【DKS】【JavaPolicy】【JavaLoginConfig】【PKIX】【PKIX】【LDAP】【Collection】【com.sun.security.IndexedCollection】
    }
    //******************************************************************************************
    //                                                                   获取字符串的签名
    //******************************************************************************************
    public static String getStrMessageDigest(String input, String algorithm) {
        try {
            //获得指定摘要算法的 MessageDigest 对象
            MessageDigest md = MessageDigest.getInstance(algorithm);
            //使用指定的字节更新摘要
            md.update(input.getBytes("utf-8"));
            //获得密文
            byte temp[] = md.digest();
            //把密文转换成十六进制的字符串形式
            return HexUtils.encode(temp);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    //******************************************************************************************
    //                                                                   获取文件的签名
    //******************************************************************************************
    public static String getFileMessageDigest(File file, String algorithm) {
        FileInputStream fis = null;
        try {
            MessageDigest md = MessageDigest.getInstance(algorithm);
            fis = new FileInputStream(file);
            byte[] buffer = new byte[102400];
            int length;
            while ((length = fis.read(buffer)) != -1) {
                md.update(buffer, 0, length);
            }
            return HexUtils.encode(md.digest());
        } catch (Exception e) {
            return null;
        } finally {
            try {
                if (fis != null) fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}


输出

字符串1的MD5签名为【C4CA4238A0B923820DCC509A6F75849B】
字符串1的SHA1签名为【356A192B7913B04C54574D18C28D46E6395428AB】

下面是两个不同的文件,但是它们的 MD5 都是一样的,这就是科学家通过碰撞破解签名的案例
文件1的MD5签名为【18FCC4334F44FED60718E7DACD82DDDF】
文件2的MD5签名为【18FCC4334F44FED60718E7DACD82DDDF】
文件1的SHA1签名为【0033F995A30FD2CCBF60CC1E7D7DB9E649397668】
文件2的SHA1签名为【30ACE7E13A7F9DC9ABBAA431241309AC6741E735】

所有支持的签名算法

SUN
    【SHA1PRNG】【SHA1withDSA】【NONEwithDSA】【SHA224withDSA】【SHA256withDSA】【DSA】【MD2】【MD5】【SHA】【SHA-224】【SHA-256】【SHA-384】【SHA-512】【DSA】【DSA】【DSA】【X.509】【JKS】【CaseExactJKS】【DKS】【JavaPolicy】【JavaLoginConfig】【PKIX】【PKIX】【LDAP】【Collection】【com.sun.security.IndexedCollection】
SunRsaSign
    【RSA】【RSA】【MD2withRSA】【MD5withRSA】【SHA1withRSA】【SHA224withRSA】【SHA256withRSA】【SHA384withRSA】【SHA512withRSA】
SunEC
    【EC】【EC】【NONEwithECDSA】【SHA1withECDSA】【SHA224withECDSA】【SHA256withECDSA】【SHA384withECDSA】【SHA512withECDSA】【EC】【ECDH】
SunJSSE
    【RSA】【RSA】【MD2withRSA】【MD5withRSA】【SHA1withRSA】【MD5andSHA1withRSA】【SunX509】【NewSunX509】【SunX509】【PKIX】【TLSv1】【TLSv1.1】【TLSv1.2】【TLS】【Default】【PKCS12】
SunJCE
    【RSA】【DES】【DESede】【DESedeWrap】【PBEWithMD5AndDES】【PBEWithMD5AndTripleDES】【PBEWithSHA1AndDESede】【PBEWithSHA1AndRC2_40】【PBEWithSHA1AndRC2_128】【PBEWithSHA1AndRC4_40】【PBEWithSHA1AndRC4_128】【PBEWithHmacSHA1AndAES_128】【PBEWithHmacSHA224AndAES_128】【PBEWithHmacSHA256AndAES_128】【PBEWithHmacSHA384AndAES_128】【PBEWithHmacSHA512AndAES_128】【PBEWithHmacSHA1AndAES_256】【PBEWithHmacSHA224AndAES_256】【PBEWithHmacSHA256AndAES_256】【PBEWithHmacSHA384AndAES_256】【PBEWithHmacSHA512AndAES_256】【Blowfish】【AES】【AES_128/ECB/NoPadding】【AES_128/CBC/NoPadding】【AES_128/OFB/NoPadding】【AES_128/CFB/NoPadding】【AES_128/GCM/NoPadding】【AES_192/ECB/NoPadding】【AES_192/CBC/NoPadding】【AES_192/OFB/NoPadding】【AES_192/CFB/NoPadding】【AES_192/GCM/NoPadding】【AES_256/ECB/NoPadding】【AES_256/CBC/NoPadding】【AES_256/OFB/NoPadding】【AES_256/CFB/NoPadding】【AES_256/GCM/NoPadding】【AESWrap】【AESWrap_128】【AESWrap_192】【AESWrap_256】【RC2】【ARCFOUR】【DES】【DESede】【Blowfish】【AES】【RC2】【ARCFOUR】【HmacMD5】【HmacSHA1】【HmacSHA224】【HmacSHA256】【HmacSHA384】【HmacSHA512】【DiffieHellman】【DiffieHellman】【DiffieHellman】【DiffieHellman】【DES】【DESede】【PBE】【PBEWithMD5AndDES】【PBEWithMD5AndTripleDES】【PBEWithSHA1AndDESede】【PBEWithSHA1AndRC2_40】【PBEWithSHA1AndRC2_128】【PBEWithSHA1AndRC4_40】【PBEWithSHA1AndRC4_128】【PBES2】【PBEWithHmacSHA1AndAES_128】【PBEWithHmacSHA224AndAES_128】【PBEWithHmacSHA256AndAES_128】【PBEWithHmacSHA384AndAES_128】【PBEWithHmacSHA512AndAES_128】【PBEWithHmacSHA1AndAES_256】【PBEWithHmacSHA224AndAES_256】【PBEWithHmacSHA256AndAES_256】【PBEWithHmacSHA384AndAES_256】【PBEWithHmacSHA512AndAES_256】【Blowfish】【AES】【GCM】【RC2】【OAEP】【DiffieHellman】【DES】【DESede】【PBEWithMD5AndDES】【PBEWithMD5AndTripleDES】【PBEWithSHA1AndDESede】【PBEWithSHA1AndRC2_40】【PBEWithSHA1AndRC2_128】【PBEWithSHA1AndRC4_40】【PBEWithSHA1AndRC4_128】【PBEWithHmacSHA1AndAES_128】【PBEWithHmacSHA224AndAES_128】【PBEWithHmacSHA256AndAES_128】【PBEWithHmacSHA384AndAES_128】【PBEWithHmacSHA512AndAES_128】【PBEWithHmacSHA1AndAES_256】【PBEWithHmacSHA224AndAES_256】【PBEWithHmacSHA256AndAES_256】【PBEWithHmacSHA384AndAES_256】【PBEWithHmacSHA512AndAES_256】【PBKDF2WithHmacSHA1】【PBKDF2WithHmacSHA224】【PBKDF2WithHmacSHA256】【PBKDF2WithHmacSHA384】【PBKDF2WithHmacSHA512】【HmacMD5】【HmacSHA1】【HmacSHA224】【HmacSHA256】【HmacSHA384】【HmacSHA512】【HmacPBESHA1】【PBEWithHmacSHA1】【PBEWithHmacSHA224】【PBEWithHmacSHA256】【PBEWithHmacSHA384】【PBEWithHmacSHA512】【SslMacMD5】【SslMacSHA1】【JCEKS】【SunTlsPrf】【SunTls12Prf】【SunTlsMasterSecret】【SunTlsKeyMaterial】【SunTlsRsaPremasterSecret】
SunJGSS
    【1.2.840.113554.1.2.2】【1.3.6.1.5.5.2】
SunSASL
    【DIGEST-MD5】【NTLM】【GSSAPI】【EXTERNAL】【PLAIN】【CRAM-MD5】【CRAM-MD5】【GSSAPI】【DIGEST-MD5】【NTLM】
XMLDSig
    【http://www.w3.org/2006/12/xml-c14n11#WithComments】【http://www.w3.org/2000/09/xmldsig#base64】【http://www.w3.org/TR/1999/REC-xslt-19991116】【http://www.w3.org/2001/10/xml-exc-c14n#】【http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments】【http://www.w3.org/2000/09/xmldsig#enveloped-signature】【http://www.w3.org/2002/06/xmldsig-filter2】【DOM】【http://www.w3.org/TR/2001/REC-xml-c14n-20010315】【http://www.w3.org/2001/10/xml-exc-c14n#WithComments】【http://www.w3.org/2006/12/xml-c14n11】【http://www.w3.org/TR/1999/REC-xpath-19991116】【DOM】
SunPCSC
    【PC/SC】
SunMSCAPI
    【Windows-PRNG】【Windows-MY】【Windows-ROOT】【NONEwithRSA】【SHA1withRSA】【SHA256withRSA】【SHA384withRSA】【SHA512withRSA】【MD5withRSA】【MD2withRSA】【RSA】【RSA】【RSA/ECB/PKCS1Padding】