はじめに
- Microsoft TeamsのOutgoingWebhookのメッセージ認証で使用したりします。
実装
//インポートファイル
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import java.util.Base64
//(A)シークレットキー(セキュリティトークン)
val secretKey="//送信Webhook作成時に払い出されたコード//"
//(B)サーバーから送信されたメッセージのハッシュ値
val authorizationHmac="//Requestデータのauthorizationヘッダーの値//"
//(C)ハッシュ値がほしいデータ
val msgBody="//RequestデータのBodyの値//"
//(1)アルゴリズムをHMAC SHA256に設定
val algo="HmacSHA256"
//(2)アルゴリズムを指定してMAC(Message Authentication Code)インスタンスを作成
val mac:Mac = Mac.getInstance(algo)
//(3)シークレットキーをBASE64でデコード
val secretKeyByte= Base64.getDecoder.decode(secretKey)
//(4)BASE64でデコードしたシークレットキーとアルゴリズムを指定してSecretKeySpecインタンスを作成
val sk:SecretKeySpec = new SecretKeySpec(secretKeyByte, algo)
//(5)MACにシークレットキーを指定して初期化
mac.init(sk)
//(6)msgBodyをByteに変換してからdoFinalメソッドでハッシュ値を作成
val msgBodyHash=mac.doFinal(msgBody.getBytes("UTF-8"))
//(7)ハッシュ値をBASE64にエンコードして接頭に"HAMC "を付けてHAMC値が完成
val msgBodyHmac:String="HMAC %s".format(Base64.getEncoder.encodeToString(msgBodyHash))
//(8)求めたHMAC値とリクエストヘッダのauthorizationの値を比較
if(authorizationHmac==msgBodyHmac){
//実際にはHttpのStatusCodeを200で返したり正常系の処理につなげる
println("HMAC認証OK!")
}else{
println("認証失敗・・")
}
以上。