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勉

posted @ 2020-01-17 16:16  晒太阳的兔子很忙  阅读(726)  评论(0编辑  收藏  举报