目錄
實現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);
}
}
