1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Scala:HMAC値を求める方法(Hash-based Message Authentication Code)

Last updated at Posted at 2020-03-21

はじめに

  • 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("認証失敗・・")
}

以上。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?