目錄
實現sha256的代碼和sha1的代碼相似
摘要算法簡介
摘要算法,也是加密算法的一種,還有另外一種叫法:指紋。摘要算法就是對指定的數據進行一系列的計算,然后得出一個串內容,該內容就是該數據的摘要。不同的數據產生的摘要是不同的,所以,可以用它來進行一些數據加密的工作:通過對比兩個數據加密后的摘要是否相同,來判斷這兩個數據是否相同。
還可以用來保證數據的完整性,常見的軟件在發布之后,會同時發布軟件的md5和sha值,這個md5和sha值就是軟件的摘要。當用戶將軟件下載之后,然后去計算軟件的摘要,如果計算所得的摘要和軟件發布方提供的摘要相同,則證明下載的軟件和發布的軟件一模一樣,否則,就是下載過程中數據(軟件)被篡改了。
常見的摘要算法包括:md、sha這兩類。md包括md2、md4、md5;sha包括sha1、sha224、sha256、sha384、sha512。
md5
md摘要算法包括多種算法:分別是md2、md4、md5。現在一般都是使用md5進行加密。
Java中實現md5加密,有三種方式:
使用jdk內置的方法實現實現md5加密
package cn.ganlixin.security; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.commons.codec.binary.Hex; public class JdkMD5 { public static void main(String[] args) throws NoSuchAlgorithmException { String plainText = "this is plain text"; // 通過調用MessageDigest(數據摘要類)的getInstance()靜態方法,傳入加密算法的名稱,獲取數據摘要對象。 //MessageDigest MessageDigest.getInstance(algorithm); MessageDigest messageDigest = MessageDigest.getInstance("MD5"); // 獲取摘要(加密),結果是字節數組 // byte[] java.security.MessageDigest.digest(byte[] input) byte[] ciphertext = messageDigest.digest(plainText.getBytes()); // 利用apache的commons-codec,將字節數組轉換為十六進制。 System.out.println(Hex.encodeHexString(ciphertext)); } }
使用bc方式實現md5加密
這種方式需要下載bc的jar包,bc是bouncycastle的縮寫。
jar包的下載地址:http://bouncycastle.org/latest_releases.html
package cn.ganlixin.security; import java.security.NoSuchAlgorithmException; import org.bouncycastle.crypto.digests.MD5Digest; import org.bouncycastle.util.encoders.Hex; public class BcMD5 { public static void main(String[] args) throws NoSuchAlgorithmException { String plainText = "this is plain text"; // 直接創建一個MD5Digest對象(bouncycastle的) MD5Digest md5Digest = new MD5Digest(); md5Digest.update(plainText.getBytes(), 0, plainText.getBytes().length); // 獲取這種加密方式在加密之后,字節數組的長度 byte[] cipherBytes = new byte[md5Digest.getDigestSize()]; md5Digest.doFinal(cipherBytes, 0); // 使用bc自己的hex類將字節數組轉換為十六進制 String cipherStr = Hex.toHexString(cipherBytes); System.out.println(cipherStr); } }
使用Cc方式實現md5加密
Cc,是commons.codec的簡寫,需要下載apache-commons-codec的jar包。
cc方式實現md5加密,其實是對jdk實現md5加密進行了封裝和簡化操作,從下面的代碼量和可讀性就可以看出來,cc方式實現md5加密很方便。
package cn.ganlixin.security; import org.apache.commons.codec.digest.DigestUtils; public class CcMD5 { public static void main(String[] args) { String plainText = "this is plain text"; // cc方式是使用codec中的DigestUtils工具類 /* 對於md5加密來說,DigestUtils提供了6個靜態方法 byte[] DigestUtils.md5(byte[] data) byte[] DigestUtils.md5(InputStream is) byte[] DigestUtils.md5(String data) String DigestUtils.md5Hex(byte[] data) String DigestUtils.md5Hex(InputStream is) String DigestUtils.md5Hex(String data) */ // 實現md5加密只需要一行代碼 String cipherText = DigestUtils.md5Hex(plainText); System.out.println(cipherText); } }
sha1
sha類加密算法有多種,共兩大類,一類是sha1,另一類包含多種加密算法:sha224、sha256、sha384、sha512,這些統稱為sha2。
其中sha1加密后的長度是160byte,sha2加密之后的密文長度和shaXxx的數字相同,比如sha256加密之后,密文長度為256byte。
使用jdk內置方法實現sha1加密
package cn.ganlixin.security; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.commons.codec.binary.Hex; public class JDKSHA1 { public static void main(String[] args) throws NoSuchAlgorithmException { String plainText = "this is plain Text"; // 獲取指定摘要算法的messageDigest對象 MessageDigest messageDigest = MessageDigest.getInstance("SHA"); // 此處的sha代表sha1 // 調用digest方法,進行加密操作 byte[] cipherBytes = messageDigest.digest(plainText.getBytes()); String cipherStr = Hex.encodeHexString(cipherBytes); System.out.println(cipherStr); } }
使用bc方式實現sha1加密
package cn.ganlixin.security; import org.bouncycastle.crypto.Digest; import org.bouncycastle.crypto.digests.SHA1Digest; import org.bouncycastle.util.encoders.Hex; public class BcSHA1 { public static void main(String[] args) { String plainText = "this is plain Text"; Digest digest = new SHA1Digest(); digest.update(plainText.getBytes(), 0, plainText.getBytes().length); // 創建保存摘要的字節數組 byte[] cipherBytes = new byte[digest.getDigestSize()]; digest.doFinal(cipherBytes, 0); String cipherText = Hex.toHexString(cipherBytes); System.out.println(cipherText); } }
使用cc方式實現sha1加密
cc方式實現sha1加密,超級簡單,和實現md5加密一樣,一行代碼即可。
package cn.ganlixin.security; import org.apache.commons.codec.digest.DigestUtils; public class CcSHA1 { public static void main(String[] args) { String cipherText = DigestUtils.sha1Hex("this is plain Text"); System.out.println(cipherText); } }