HashUtil.java 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package com.caimei.utils;
  2. import java.security.MessageDigest;
  3. public class HashUtil {
  4. private static final java.security.SecureRandom random = new java.security.SecureRandom();
  5. private static final char[] HEX_DIGITS = "0123456789abcdef".toCharArray();
  6. private static final char[] CHAR_ARRAY = "_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
  7. public static String md5(String srcStr) {
  8. return hash("MD5", srcStr);
  9. }
  10. public static String sha1(String srcStr) {
  11. return hash("SHA-1", srcStr);
  12. }
  13. public static String sha256(String srcStr) {
  14. return hash("SHA-256", srcStr);
  15. }
  16. public static String sha384(String srcStr) {
  17. return hash("SHA-384", srcStr);
  18. }
  19. public static String sha512(String srcStr) {
  20. return hash("SHA-512", srcStr);
  21. }
  22. public static String hash(String algorithm, String srcStr) {
  23. try {
  24. MessageDigest md = MessageDigest.getInstance(algorithm);
  25. byte[] bytes = md.digest(srcStr.getBytes("utf-8"));
  26. return toHex(bytes);
  27. } catch (Exception e) {
  28. throw new RuntimeException(e);
  29. }
  30. }
  31. public static String toHex(byte[] bytes) {
  32. StringBuilder ret = new StringBuilder(bytes.length * 2);
  33. for (int i = 0; i < bytes.length; i++) {
  34. ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]);
  35. ret.append(HEX_DIGITS[bytes[i] & 0x0f]);
  36. }
  37. return ret.toString();
  38. }
  39. /**
  40. * md5 128bit 16bytes
  41. * sha1 160bit 20bytes
  42. * sha256 256bit 32bytes
  43. * sha384 384bit 48bytes
  44. * sha512 512bit 64bytes
  45. */
  46. public static String generateSalt(int saltLength) {
  47. StringBuilder salt = new StringBuilder(saltLength);
  48. for (int i = 0; i < saltLength; i++) {
  49. salt.append(CHAR_ARRAY[random.nextInt(CHAR_ARRAY.length)]);
  50. }
  51. return salt.toString();
  52. }
  53. public static String generateSaltForSha256() {
  54. return generateSalt(32);
  55. }
  56. public static String generateSaltForSha512() {
  57. return generateSalt(64);
  58. }
  59. public static boolean slowEquals(byte[] a, byte[] b) {
  60. if (a == null || b == null) {
  61. return false;
  62. }
  63. int diff = a.length ^ b.length;
  64. for (int i = 0; i < a.length && i < b.length; i++) {
  65. diff |= a[i] ^ b[i];
  66. }
  67. return diff == 0;
  68. }
  69. }