ホームページ  >  記事  >  バックエンド開発  >  hmac.New(h func() hash.Hash, key byte) JavaScript での hash.Hash と同等

hmac.New(h func() hash.Hash, key byte) JavaScript での hash.Hash と同等

WBOY
WBOY転載
2024-02-09 08:12:18528ブラウズ

hmac.New(h func() hash.Hash, key byte) hash.Hash 在 JavaScript 中等效

PHP では、データのセキュリティを保護するために暗号化アルゴリズムを使用する必要があることがよくあります。 HMAC (ハッシュベースのメッセージ認証コード) は、データの整合性と ID 認証を検証するために一般的に使用される暗号化アルゴリズムです。 PHP では、hmac.New() 関数を使用して HMAC インスタンスを作成できます。これには、ハッシュ関数とキーを指定する必要があります。同様に、JavaScript では、同等のメソッドを使用して同じ機能を実現できます。この記事では、JavaScript で同等のメソッドを使用して HMAC インスタンスを作成する方法と、PHP と JavaScript の間でデータを暗号化および復号化する方法を説明します。

質問内容

go lang hmac.newのjs実装で数日間行き詰まりそうになりました。しかし、成功はありませんでした。実装には cryptocrypto-jsstablelib モジュールを使用します。問題は、go lang バージョンでは、hmac インスタンスから hmac インスタンスを作成できることです。例: (コード ブロックは正しく、テスト済みです):

リーリー

実のところ、私もそれがどのように機能するのか知りません!すべての JavaScript 関連モジュールでは、hmac から hmac を作成できず、ハッシュ アルゴリズムを決定する string 値を受け入れるためです。

JavaScript で hmac から hmac を作成する方法を尋ねたほうがよいかもしれません。

解決策は何ですか?

go バージョンの出力が実装の出力と同じである場合、その解決策は正しいです。

回避策

仕様 (rfc 2104) に従って、hmac は sha256 などのダイジェスト関数を内部で使用します。

ただし、実装では、ダイジェストの代わりに別の hmac を内部で使用する hmac が適用されます (実際には互換性がありません)。ここで、最下位レベルの hmac のみが内部で通常のダイジェストを使用します。これにより、入れ子構造が作成されます。

通常の hmac (ダイジェスト付き) の仕様に基づいて、これを go コードで使用される hmac (ダイジェストの代わりに) を使用した hmac に拡張できます。

hmac(k xor opad, hmac(k xor ipad, text)) s. rfc2104、セクション 2。 hmac

の定義

仕様との違いにより、このような機能をそのままサポートする JavaScript ライブラリを見つけるのはそれほど簡単ではないかもしれません。
ほとんどのライブラリは確かに hmac をサポートしていますが、nodejs の暗号化モジュールの crypto.createhmac() などのダイジェスト (hmac ではない) のみを指定できます。 その他の回答 も参照してください。 。このアプローチは、Go コードでロジックを実装するために使用できるとは思いません。

他の回答のアプローチが機能せず、必要な機能を備えた別の JavaScript ライブラリが見つからない場合は、hmac の仕様が比較的単純であるため (上記を参照)、JavaScript でロジックを自分で実装できます。

次のコードは、nodejs の暗号モジュールの実装例です:

リーリー ###結果:### リーリー ###テスト:###

次の go コードは同じ結果を生成します:

リーリー ######編集:######

この記事

からインスピレーションを得た、よりコンパクト/効率的な

hmac_rec()

の実装です。これは、通常の最後の反復ステップに hmac を使用します (これにより、

gethash( )### 廃止): ### リーリー

以上がhmac.New(h func() hash.Hash, key byte) JavaScript での hash.Hash と同等の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。