HashCode 是驗證資料是否被串改常用的驗證值,因為原始字串如果被修改了,重新再取得的 HashCode 就會不一樣
以下是一個簡單取得 SHA-256 值的方法
String data = "Encrypt this String in SHA256";
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(data.getBytes(StandardCharsets.UTF_8));
System.out.println(Base64.getEncoder().encodeToString(hash));
但在單純只做 SHA-256 的狀況下,如果我攔劫該資料後只要一同修改原始資料及 HashCode ,驗證的結果還是一樣會是正確的
所以通常單純使用 SHA-256 加密驗證通常會多加一個 Seed,也就是雙方才知道的密碼,在加密成 HashCode 時需加入該密碼才會產生一樣的 HashCode
以下則是一個加入 Seed 值的 SHA-256
String keyAlgorithms = "HmacSHA256";
int keyLength = 256;
String keySeed = "Key Seed";
KeyGenerator keyGen = KeyGenerator.getInstance(keyAlgorithms);
keyGen.init(keyLength);
SecureRandom random = new SecureRandom();
random.setSeed(keySeed.getBytes());
keyGen.init(random);
Key key = keyGen.generateKey();
Mac mac = Mac.getInstance(keyAlgorithms);
mac.init(key);
String data = "Encrypt this String in SHA256";
byte[] hashMac = mac.doFinal(data.getBytes());
System.out.println(Base64.getEncoder().encodeToString(hashMac));