加密演算法比較:SHA1,SHA256,MD5
MD5輸出128bit、SHA1輸出160bit、SHA256輸出256bit
SHA-1
是160位的雜湊值,而SHA-2
是組合值,有不同的位數,其中最受歡迎的是256位。
因為SHA-2
有多種不同的位數,導致這個名詞有一些混亂。但是無論是“SHA-2
”,“SHA-256
”或“SHA-256位
”,其實都是指同一種加密演算法。但是SHA-224
,“SHA-384
”或“SHA-512
”,表示SHA-2
的二進位制長度。還要另一種就是會把演算法和二進位制長度都寫上,如“SHA-2 384
”。
SSL行業選擇SHA
作為數字簽名的雜湊演算法,從2011到2015,一直以SHA-1
位主導演算法。但隨著網際網路技術的提升,SHA-1
的缺點越來越突顯。從去年起,SHA-2
成為了新的標準,所以現在簽發的SSL
證照,必須使用該演算法簽名。
也許有人偶爾會看到SHA-2 384
位的證照,很少會看到224
位,因為224
位不允許用於公共信任的證照,512
位,不被軟體支援。
初步預計,SHA-2
的使用年限為五年,但也許會被提前淘汰。這需要時間來驗證。
以一個60M的檔案為測試樣本,經過1000次的測試平均值,三種演算法的表現為:
MD5演算法執行1000次的平均時間為:226ms
SHA1演算法執行1000次的平均時間為:308ms
SHA256演算法執行1000次的平均時間為:473ms
安全性方面,顯然SHA256
(又稱SHA2
)的安全性最高,但是耗時要比其他兩種多很多。MD5
相對較容易破解,因此,SHA1
應該是這三種中效能最好的一款加密演算法。
JAVA實現:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.zip.CRC32;
public class FileSafeCode {
/**
* 計算大檔案 md5獲取getMD5(); SHA1獲取getSha1() CRC32獲取 getCRC32()
*/
protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
'f' };
public static MessageDigest messagedigest = null;
/**
* 對一個檔案獲取md5值
*
* @return md5串
* @throws NoSuchAlgorithmException
*/
public static String getMD5(File file) throws IOException, NoSuchAlgorithmException {
messagedigest = MessageDigest.getInstance("MD5");
FileInputStream in = new FileInputStream(file);
FileChannel ch = in.getChannel();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
messagedigest.update(byteBuffer);
return bufferToHex(messagedigest.digest());
}
/**
* // * @param target 字串 求一個字串的md5值 // * @return md5 value //
*/
// public static String StringMD5(String target) {
// return DigestUtils.md5Hex(target);
// }
/***
* 計算SHA1碼
*
* @return String 適用於上G大的檔案
* @throws NoSuchAlgorithmException
*/
public static String getSha1(File file) throws OutOfMemoryError, IOException, NoSuchAlgorithmException {
messagedigest = MessageDigest.getInstance("SHA-1");
FileInputStream in = new FileInputStream(file);
FileChannel ch = in.getChannel();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
messagedigest.update(byteBuffer);
return bufferToHex(messagedigest.digest());
}
/**
* 獲取檔案SHA256碼
*
* @return String
*/
public static String getSha256(File file) throws OutOfMemoryError, IOException, NoSuchAlgorithmException {
messagedigest = MessageDigest.getInstance("SHA-256");
FileInputStream in = new FileInputStream(file);
FileChannel ch = in.getChannel();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
messagedigest.update(byteBuffer);
return bufferToHex(messagedigest.digest());
}
/**
* 獲取檔案CRC32碼
*
* @return String
*/
public static String getCRC32(File file) {
CRC32 crc32 = new CRC32();
// MessageDigest.get
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[8192];
int length;
while ((length = fileInputStream.read(buffer)) != -1) {
crc32.update(buffer, 0, length);
}
return crc32.getValue() + "";
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
try {
if (fileInputStream != null)
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static String getMD5String(String s) {
return getMD5String(s.getBytes());
}
public static String getMD5String(byte[] bytes) {
messagedigest.update(bytes);
return bufferToHex(messagedigest.digest());
}
/**
* @Description 計算二進位制資料
* @return String
*/
private static String bufferToHex(byte bytes[]) {
return bufferToHex(bytes, 0, bytes.length);
}
private static String bufferToHex(byte bytes[], int m, int n) {
StringBuffer stringbuffer = new StringBuffer(2 * n);
int k = m + n;
for (int l = m; l < k; l++) {
appendHexPair(bytes[l], stringbuffer);
}
return stringbuffer.toString();
}
private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
char c0 = hexDigits[(bt & 0xf0) >> 4];
char c1 = hexDigits[bt & 0xf];
stringbuffer.append(c0);
stringbuffer.append(c1);
}
public static boolean checkPassword(String password, String md5PwdStr) {
String s = getMD5String(password);
return s.equals(md5PwdStr);
}
}
相關文章
- Windows自帶MD5 SHA1 SHA256命令列工具Windows命令列
- JavaScript實現的base64加密、md5加密、sha1加密及AES加密JavaScript加密
- 使用Windows 10自帶工具 校驗MD5 SHA1 SHA256型別檔案Windows型別
- 比較檔案是否相同,(比較MD5值)
- MD5加密演算法加密演算法
- .Net Core 最優 MD5 開啟方式!初學者建議收藏(支援 SHA1,SHA256,.Net Framework)Framework
- MD5雜湊加密演算法加密演算法
- Java實現密碼、檔案MD5加密,密碼sha256、sha384、sha512Hex等加密Java密碼加密
- 常見的校驗演算法crc(32),md5(128),sha1(160)演算法
- MD5加密加密
- 常見安全演算法(MD5、SHA1、Base64等等)總結演算法
- 加密演算法原理分析(MD5、SHA-256)加密演算法
- java MD5 加密Java加密
- 排序演算法效能比較排序演算法
- c#使用SHA256演算法實現對檔案的加密和解密C#演算法加密解密
- JAVA中MD5加密(MD5工具類)Java加密
- Vue 前端md5加密Vue前端加密
- MD5加密工具類加密
- 摘要與加密的區別(以MD5演算法為例)加密演算法
- Oracle中的MD5加密Oracle加密
- qt實現md5加密QT加密
- C# MD5 加密,解密C#加密解密
- Oracle和MySQL md5加密OracleMySql加密
- 獲取md5加密值加密
- 初練演算法,比較演算法之美演算法
- 演算法:比較含退格的字串演算法字串
- 常用的比較排序演算法總結排序演算法
- 三種高階比較排序演算法排序演算法
- 粒子群演算法和遺傳演算法的比較演算法
- js 深比較和淺比較JS
- java md5加密的幾種方式Java加密
- python怎麼使用md5加密解密Python加密解密
- 共識演算法的比較:Casper vs Tendermint演算法
- 什麼是安全雜湊演算法SHA256?演算法
- 資訊保安:資料加密實戰!對專案中資料使用MD5演算法進行加密加密演算法
- Java 和 .NET SHA1演算法記錄Java演算法
- Golang兩種方法實現MD5加密Golang加密
- 資料庫級別的 MD5 加密資料庫加密