当前位置:   article > 正文

加密算法比较:SHA1,SHA256(SHA2),MD5_sha1和sha256生成的md5是一样的吗

sha1和sha256生成的md5是一样的吗

1、性能方面

以一个60M的文件为测试样本,经过1000次的测试平均值,三种算法的表现为:

  1. MD5算法运行1000次的平均时间为:226ms
  2. SHA1算法运行1000次的平均时间为:308ms
  3. 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实现

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.nio.MappedByteBuffer;
  6. import java.nio.channels.FileChannel;
  7. import java.security.MessageDigest;
  8. import java.security.NoSuchAlgorithmException;
  9. import java.util.zip.CRC32;
  10. public class FileSafeCode {
  11. /**
  12. * 计算大文件 md5获取getMD5(); SHA1获取getSha1() CRC32获取 getCRC32()
  13. */
  14. protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
  15. 'f' };
  16. public static MessageDigest messagedigest = null;
  17. /**
  18. * 对一个文件获取md5值
  19. *
  20. * @return md5串
  21. * @throws NoSuchAlgorithmException
  22. */
  23. public static String getMD5(File file) throws IOException, NoSuchAlgorithmException {
  24. messagedigest = MessageDigest.getInstance("MD5");
  25. FileInputStream in = new FileInputStream(file);
  26. FileChannel ch = in.getChannel();
  27. MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
  28. messagedigest.update(byteBuffer);
  29. return bufferToHex(messagedigest.digest());
  30. }
  31. /**
  32. * // * @param target 字符串 求一个字符串的md5值 // * @return md5 value //
  33. */
  34. // public static String StringMD5(String target) {
  35. // return DigestUtils.md5Hex(target);
  36. // }
  37. /***
  38. * 计算SHA1码
  39. *
  40. * @return String 适用于上G大的文件
  41. * @throws NoSuchAlgorithmException
  42. */
  43. public static String getSha1(File file) throws OutOfMemoryError, IOException, NoSuchAlgorithmException {
  44. messagedigest = MessageDigest.getInstance("SHA-1");
  45. FileInputStream in = new FileInputStream(file);
  46. FileChannel ch = in.getChannel();
  47. MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
  48. messagedigest.update(byteBuffer);
  49. return bufferToHex(messagedigest.digest());
  50. }
  51. /**
  52. * 获取文件SHA256码
  53. *
  54. * @return String
  55. */
  56. public static String getSha256(File file) throws OutOfMemoryError, IOException, NoSuchAlgorithmException {
  57. messagedigest = MessageDigest.getInstance("SHA-256");
  58. FileInputStream in = new FileInputStream(file);
  59. FileChannel ch = in.getChannel();
  60. MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
  61. messagedigest.update(byteBuffer);
  62. return bufferToHex(messagedigest.digest());
  63. }
  64. /**
  65. * 获取文件CRC32码
  66. *
  67. * @return String
  68. */
  69. public static String getCRC32(File file) {
  70. CRC32 crc32 = new CRC32();
  71. // MessageDigest.get
  72. FileInputStream fileInputStream = null;
  73. try {
  74. fileInputStream = new FileInputStream(file);
  75. byte[] buffer = new byte[8192];
  76. int length;
  77. while ((length = fileInputStream.read(buffer)) != -1) {
  78. crc32.update(buffer, 0, length);
  79. }
  80. return crc32.getValue() + "";
  81. } catch (FileNotFoundException e) {
  82. e.printStackTrace();
  83. return null;
  84. } catch (IOException e) {
  85. e.printStackTrace();
  86. return null;
  87. } finally {
  88. try {
  89. if (fileInputStream != null)
  90. fileInputStream.close();
  91. } catch (IOException e) {
  92. e.printStackTrace();
  93. }
  94. }
  95. }
  96. public static String getMD5String(String s) {
  97. return getMD5String(s.getBytes());
  98. }
  99. public static String getMD5String(byte[] bytes) {
  100. messagedigest.update(bytes);
  101. return bufferToHex(messagedigest.digest());
  102. }
  103. /**
  104. * @Description 计算二进制数据
  105. * @return String
  106. */
  107. private static String bufferToHex(byte bytes[]) {
  108. return bufferToHex(bytes, 0, bytes.length);
  109. }
  110. private static String bufferToHex(byte bytes[], int m, int n) {
  111. StringBuffer stringbuffer = new StringBuffer(2 * n);
  112. int k = m + n;
  113. for (int l = m; l < k; l++) {
  114. appendHexPair(bytes[l], stringbuffer);
  115. }
  116. return stringbuffer.toString();
  117. }
  118. private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
  119. char c0 = hexDigits[(bt & 0xf0) >> 4];
  120. char c1 = hexDigits[bt & 0xf];
  121. stringbuffer.append(c0);
  122. stringbuffer.append(c1);
  123. }
  124. public static boolean checkPassword(String password, String md5PwdStr) {
  125. String s = getMD5String(password);
  126. return s.equals(md5PwdStr);
  127. }
  128. }

2)Google Guava实现(推荐)

  1. /**
  2. * 计算一个文件的MD5、SHA1、SHA256值
  3. *
  4. */
  5. @Test
  6. public void testFileMD5() throws IOException {
  7. File file = new File(SOURCE_FILE);
  8. HashCode hashCode = Files.asByteSource(file).hash(Hashing.md5());
  9. System.out.println(hashCode);
  10. HashCode hashCode2 = Files.asByteSource(file).hash(Hashing.sha256());
  11. System.out.println(hashCode2);
  12. HashCode hashCode3 = Files.asByteSource(file).hash(Hashing.sha1());
  13. System.out.println(hashCode3);
  14. }

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号