测试代码
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】