加密算法比较:SHA1,SHA256(SHA2),MD5
程序员文章站
2024-03-16 18:19:52
...
1、性能方面
以一个60M的文件为测试样本,经过1000次的测试平均值,三种算法的表现为:
MD5算法运行1000次的平均时间为:226ms
SHA1算法运行1000次的平均时间为:308ms
SHA256算法运行1000次的平均时间为:473ms
2、安全性方面
- SHA256(又称SHA2)的安全性最高,但是耗时要比其他两种多很多。
- MD5相对较容易碰撞,安全性不高:
- SHA1安全性不高:2017年2月23日,Google公司公告宣称他们与CWI Amsterdam合作共同创建了两个有着相同的SHA-1值但内容不同的PDF文件,这代表SHA-1算法已被正式攻破。[16]。以上来自:https://zh.wikipedia.org/wiki/SHA-1
3、实现
1)JAVA原生API实现
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);
}
}
2)Google Guava实现(推荐)
/**
* 计算一个文件的MD5、SHA1、SHA256值
*
*/
@Test
public void testFileMD5() throws IOException {
File file = new File(SOURCE_FILE);
HashCode hashCode = Files.asByteSource(file).hash(Hashing.md5());
System.out.println(hashCode);
HashCode hashCode2 = Files.asByteSource(file).hash(Hashing.sha256());
System.out.println(hashCode2);
HashCode hashCode3 = Files.asByteSource(file).hash(Hashing.sha1());
System.out.println(hashCode3);
}
上一篇: 对称加密与非对称加密
推荐阅读
-
加密算法比较:SHA1,SHA256(SHA2),MD5
-
生成、查看文件的MD5、SHA1、SHA2、SHA3值
-
详解Java中实现SHA1与MD5加密算法的基本方法
-
Python md5与sha1加密算法用法分析
-
Python md5与sha1加密算法用法分析
-
加密算法在windows下的检测办法[md5,sha1]
-
c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法源代码
-
c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法源代码
-
加密算法 Md5 & Sha1
-
NodeJS 生成文件校验码 checksum (md5, sha1, sha256, sha512)