Java中WEAK_PASSWORD_HASH的修改策略
在采用SHA-256对数据进行加密时,我们可以直接采用下面的方式进行处理:
public static String encodeBySha256(String content) { String encode = ""; try { MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); messageDigest.update(content.getBytes("UTF-8")); encode = bytesToHex(messageDigest.digest()); } catch (Exception e) { System.out.println(e.getMessage()); } return encode; } public static String bytesToHex(byte... src) { if (src == null || src.length <= 0) { return null; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < src.length; i++) { int value = src[i] & 0xFF; String hexValue = Integer.toHexString(value); if (hexValue.length() < 2) { sb.append(0); } sb.append(hexValue); } return sb.toString(); }
上述代码能够实现对数据的SHA-256加密,但是会在encode = bytesToHex(messageDigest.digest());这一行提示WEAK_PASSWORD_HASH问题,这主要是因为不适宜直接调用messageDigest.digest()方法。那如何解决呢,我们可以采用反射的方式来处理,直接看下面修改后的代码:
public static String encodeBySha256(String content) { String encodeString = ""; try { Class<?> mdClass = Class.forName("java.security.MessageDigest"); Method method = mdClass.getMethod("getInstance", String.class); MessageDigest messageDigest = (MessageDigest) method.invoke(null, "SHA-256"); messageDigest.update(content.getBytes("UTF-8")); method = mdClass.getMethod("digest"); byte[] bytes = (byte[]) method.invoke(messageDigest); encodeString = bytesToHex(bytes); } catch (Exception exception) { System.out.println(exception.getMessage()); } return encodeString;
}
经过上述修改后,就不再报WEAK_PASSWORD_HASH的问题。
延伸:若是采用MD5的加密方式的话,只需要在method.invoke(null, "SHA-256")修改为method.invoke(null, "MD5")即可。
------20200117勉
阅读是一种修养,分享是一种美德。