HMACの計算
2 posters
HMACの計算
みなさんこんにちは。
JWSを生成するためにHMACを計算するコードを4Dで書いているのですが、正しい答えを計算できず行き詰まっております。
どなたか、ここがおかしいじゃん、とご指摘いただけるとありがたいです。以下のコード例はHMAC-SHA256を前提にしています。
なおこのストラクチャーは
github.com/KoichiHaradaEndor/Crypto
に置いてありますので、こちらが見にくければ、ぜひそちらをご参照ください。
_t : テキスト型
_x : BLOB型
JWSを生成するためにHMACを計算するコードを4Dで書いているのですが、正しい答えを計算できず行き詰まっております。
どなたか、ここがおかしいじゃん、とご指摘いただけるとありがたいです。以下のコード例はHMAC-SHA256を前提にしています。
なおこのストラクチャーは
github.com/KoichiHaradaEndor/Crypto
に置いてありますので、こちらが見にくければ、ぜひそちらをご参照ください。
_t : テキスト型
_x : BLOB型
- Code:
// 鍵の前処理
CONVERT FROM TEXT($key_t;"UTF-8";$key_x)
If (BLOB size($key_x)>64)
// 鍵のサイズがブロック長を超えていたらハッシュする
$key_t:=Generate digest($key_x;SHA256_Digest)
CONVERT FROM TEXT($key_t;"UTF-8";$key_x)
End if
// ブロック長まで0x00で埋める
SET BLOB SIZE($key_x;$blockSize_l;0x0000)
// ipadKeyとopadKeyを作成する
SET BLOB SIZE($ipadKey_x;$blockSize_l;0x0036)
SET BLOB SIZE($opadKey_x;$blockSize_l;0x005C)
// KeyとのXORをとる
For ($i;0;$blockSize_l-1)
$ipadKey_x{$i}:=$key_x{$i} ^| $ipadKey_x{$i}
$opadKey_x{$i}:=$key_x{$i} ^| $opadKey_x{$i}
End for
// H(ipad || M)
CONVERT FROM TEXT($message_t;"UTF-8";$message_x)
COPY BLOB($message_x;$ipadKey_x;0;BLOB size($ipadKey_x);BLOB size($message_x)) // ipad || M
$firstDigest_t:=Generate digest($ipadKey_x;$algorithm_l)
CONVERT FROM TEXT($firstDigest_t;"UTF-8";$firstDigest_x)
// H(opad || FirstDigest)
COPY BLOB($firstDigest_x;$opadKey_x;0;BLOB size($opadKey_x);BLOB size($firstDigest_x))
$hmac_t:=Generate digest($opadKey_x;$algorithm_l)
HARADA Koichi- 投稿数 : 14
登録日 : 2020/04/10
Re: HMACの計算
ちなみにmacOSでは
- Code:
$command_t:="openssl dgst -"+$algorithm_t+" -hmac \""+$key_t+"\""
LAUNCH EXTERNAL PROCESS($command_t;$message_t;$hmac_t;$error_t)
HARADA Koichi- 投稿数 : 14
登録日 : 2020/04/10
Re: HMACの計算
miyako さん
いつも素早いリプライありがとうございます。
はい、JWTをHMAC等で署名してJWSにしたかったのです。
早速参考にさせていただきます。
いつも素早いリプライありがとうございます。
はい、JWTをHMAC等で署名してJWSにしたかったのです。
早速参考にさせていただきます。
HARADA Koichi- 投稿数 : 14
登録日 : 2020/04/10
Re: HMACの計算
追伸
バージョンは未定ですが,4D for iOSの関係で,"ES256 json web token"を標準コマンドでサポートするための作業が現在進行中です。近々,上記のようなソリューションは採用しなくても良くなるかもしれません。
バージョンは未定ですが,4D for iOSの関係で,"ES256 json web token"を標準コマンドでサポートするための作業が現在進行中です。近々,上記のようなソリューションは採用しなくても良くなるかもしれません。
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: HMACの計算
Ya Hoo!
それは嬉しいニュースです。
標準コマンドで用意されるのが一番ですからね。
ところで一番標準コマンドで欲しいのは、暗号論的疑似乱数を生成するコマンドだったりします。
みなさんセッションIDやJWSの鍵生成などどうされているのでしょう。
"ES256 json web token"を標準コマンドとして実装する時に同時に鍵生成コマンドもないと、4D的にはすべて内部で生成・検証を行う形になり、ひいては4D for iOSでしか使えないなんてことにならないかな。そういう意味ではJWKもサポートして欲しいところです。
ああっすみません、嬉しくてつい欲求が溢れ出してしまいました。
それは嬉しいニュースです。
標準コマンドで用意されるのが一番ですからね。
ところで一番標準コマンドで欲しいのは、暗号論的疑似乱数を生成するコマンドだったりします。
みなさんセッションIDやJWSの鍵生成などどうされているのでしょう。
"ES256 json web token"を標準コマンドとして実装する時に同時に鍵生成コマンドもないと、4D的にはすべて内部で生成・検証を行う形になり、ひいては4D for iOSでしか使えないなんてことにならないかな。そういう意味ではJWKもサポートして欲しいところです。
ああっすみません、嬉しくてつい欲求が溢れ出してしまいました。
HARADA Koichi- 投稿数 : 14
登録日 : 2020/04/10
Re: HMACの計算
miyakoさん
情報をいただきありがとうございました。
ミスは、HEX文字列をUTF-8としてBLOBにしていたことでした。
一つの文字づつ4byteにつっこむべきでした。
情報をいただきありがとうございました。
ミスは、HEX文字列をUTF-8としてBLOBにしていたことでした。
一つの文字づつ4byteにつっこむべきでした。
HARADA Koichi- 投稿数 : 14
登録日 : 2020/04/10
Re: HMACの計算
「鍵生成コマンドもないと・・」
前述したcryptoですが,ECDSAキーペア(ES256, ES384, ES512用)とRSAキーペア(RS256, RS384, RS512, PS256, PS384用)の生成はサポートされることになりそうです。
しかし,暗号論的疑似乱数については,何も予定されていないようです。
前述したcryptoですが,ECDSAキーペア(ES256, ES384, ES512用)とRSAキーペア(RS256, RS384, RS512, PS256, PS384用)の生成はサポートされることになりそうです。
しかし,暗号論的疑似乱数については,何も予定されていないようです。
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: HMACの計算
ざっとネットサーフィンしただけなので,間違っているかもしれませんが・・
Windows: BCryptOpenAlgorithmProvider+ BCRYPT_RNG_ALGORITHM+ BCryptGenRandom
macOS: arc4random
で合格でしょうか。
c.f.
https://tics.tiobe.com/viewerCPP/index.php?ID=2636
https://www.jpcert.or.jp/m/sc-rules/c-msc30-c.html
Windows: BCryptOpenAlgorithmProvider+ BCRYPT_RNG_ALGORITHM+ BCryptGenRandom
macOS: arc4random
で合格でしょうか。
c.f.
https://tics.tiobe.com/viewerCPP/index.php?ID=2636
https://www.jpcert.or.jp/m/sc-rules/c-msc30-c.html
miyako- 投稿数 : 487
登録日 : 2016/07/05
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: HMACの計算
miyakoさん
調査いただきありがとうございます。
いやー、それなら大丈夫!と言うことができるならよいのですがね。
わたしはそちらの専門ではないので、だからこそ4Dに安全なセッションIDやHMAC鍵を発行するコマンドを用意して欲しいのです。
これはIPAの資料にも書いてありますが、素人が勝手に「これでよいだろう」と判断するのではなく、ベンダーが提供する機能を使えとなっています。
なので、ここはセキュリティや暗号の専門家の方にお任せしたいです。
調査いただきありがとうございます。
いやー、それなら大丈夫!と言うことができるならよいのですがね。
わたしはそちらの専門ではないので、だからこそ4Dに安全なセッションIDやHMAC鍵を発行するコマンドを用意して欲しいのです。
これはIPAの資料にも書いてありますが、素人が勝手に「これでよいだろう」と判断するのではなく、ベンダーが提供する機能を使えとなっています。
なので、ここはセキュリティや暗号の専門家の方にお任せしたいです。
HARADA Koichi- 投稿数 : 14
登録日 : 2020/04/10
Re: HMACの計算
HARADA Koichi wrote:Ya Hoo!
それは嬉しいニュースです。
標準コマンドで用意されるのが一番ですからね。
4D v18 R4 で Crytokey クラスが追加され,コマンドで鍵が発行できるようになりました。
新機能をぜひご確認ください。
ご参考記事:https://blog.4d.com/cryptokey-encrypt-decrypt-sign-and-verify/
ドキュメント:http://developer.4d.com/docs/ja/API/cryptoClass.html
サンプル:https://github.com/4D-JP/HDI/releases/download/18r4/HDI_Cryptokey_class.zip
---
暗号論的疑似乱数について
Random関数が内部的に使用している関数は下記のとおりです。
https://4d-jp.github.io/2020/08/20/random/
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: HMACの計算
miyakoさんありがとうございます。
鍵も生成できるし、嬉しい限りです。
せっかく作ったJWTコンポーネントは一回も陽の目を見ることなく、ネイティブに置き換えられましたが、良い方向です。
鍵も生成できるし、嬉しい限りです。
せっかく作ったJWTコンポーネントは一回も陽の目を見ることなく、ネイティブに置き換えられましたが、良い方向です。
HARADA Koichi- 投稿数 : 14
登録日 : 2020/04/10
Permissions in this forum:
返信投稿: 不可