以下のようなnode.jsのコードでsha256の文字列を求めました。
lang
1var crypto = require('crypto'); 2 3var key = '123'; 4var msg = 'abc'; 5console.log(createHmac(key, msg)); 6 7function createHmac(key, body) { 8 var data = key + body; 9 var hmac = crypto.createHmac('sha256', data); 10 hmac = hmac.update(data); 11 return hmac.digest('hex'); 12}
Javaで同じような処理を行っても、結果が同じになりません。
Javaコードを、nodejsの結果に合わせたいのですが、どのような点に注意すればよろしいでしょうか。
Javaで検証済みのコードは以下2つなどです。
lang
1 public static String createHmac(String key, String body) { 2 String data = key+ body; 3 return org.apache.commons.codec.digest.DigestUtils.sha256Hex(data); 4 }
lang
1※投稿時に調整したため、コンパイルエラーがあったらごめんなさい 2 3 public static String createHmac(String key, String body) { 4 String data = key + body; 5 byte[] bytes = data.getBytes(); 6 7 SecretKeySpec secretKey = new SecretKeySpec(bytes, "HmacSHA256"); 8 String result = ""; 9 10 byte[] resultBytes = null; 11 try { 12 Mac hmac = Mac.getInstance(secretKey.getAlgorithm()); 13 mac.init(secretKey); 14 resultBytes = mac.doFinal(bytes); 15 result = byteToString(resultBytes); 16 17 } catch (NoSuchAlgorithmException e) { 18 } catch (InvalidKeyException e) { 19 } 20 return result; 21 } 22 private static String byteToString(byte[] bytes) { 23 StringBuffer buffer = new StringBuffer(); 24 for (int i = 0; i < bytes.length; i++) { 25 int d = bytes[i]; 26 d += (d < 0)? 256 : 0; 27 if (d < 16) { 28 buffer.append("0"); 29 } 30 buffer.append(Integer.toString(d, 16)); 31 } 32 return buffer.toString(); 33 } 34
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。