概要
- jsで文字列「foobar」をSHA-256アルゴリズムを用いてハッシュ化し、PHPでハッシュ化された文字列と文字列「foobar」が一致するか確認する方法をまとめる。
ユースケース
- lambda関数からPHP/Laravelで作られたエンドポイントにリクエストを送る際に文字列「foobar」をリクエストヘッダで送りたい。
- 文字列「foobar」はlambda関数のjsでSHA-256でハッシュ化され、axiosでリクエストヘッダに格納されリクエストが投げられる。
- PHP/Laravelでは平文の文字列「foobar」を.envなどで保持する。受け取ったリクエストのリクエストヘッダからハッシュ化されたAPIキーを受け取り、文字列「foobar」と比較し一致していたら「valid!」と、一致しなかったら「invalid!」とechoする。
この記事でやること
- ランタイムNode.js18のlambda関数で文字列「foobar」をcryptoモジュールでSHA-256でハッシュ化する。
- ハッシュ化した文字列をconsole.logで出力する。
- 出力されたハッシュ化された文字列を手動でコピーする。
- PHPがブラウザで動作する下記サービスを使って、確認用コードを記載し、ハッシュ化した文字列と平文の「foobar」が一致することを確認する。
方法
-
ランタイムNode.js18のlambda関数を作成する。
-
cryptoモジュールをlambdaレイヤーに登録し、作成した関数に紐付ける。
- 任意のモジュールをlambdaレイヤーに登録する方法はこちら → lambda レイヤーを作成しよう(Node.js18)
-
lambda関数に下記の内容を記載し、保存 → Deployする。
index.mjsimport crypto from "crypto"; const hash = crypto.createHash('sha256'); hash.update('foobar'); const hashedData = hash.digest('hex'); console.log(hashedData); export const handler = async(event) => { // TODO implement const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
-
lambdaのHello-Worldテストを定義する。
-
lambda関数をHello-Worldテストを実行して動かす。
-
「Execution results」のタブに「foobar」をSHA-256アルゴリズムでハッシュ化した文字列が出力されていることを確認する。
-
下記を開く
-
PHPを開き、下記のコードを記載する。(SHA-256でハッシュ化された値は
password_verify()
メソッドなどではチェックする事ができない。そのため、PHP側でもハッシュ元の文字列をSHA-256でハッシュ化し、===
を用いた厳密比較で整合性をチェックする)<?php $str = 'foobar'; $hash = 'jsでfoobarをSHA-256でハッシュ化した文字列'; $calculatedHash = hash('sha256', $str); if ($calculatedHash === $hash) { echo 'valid!'; } else { echo 'invalid!'; } ?>
-
「jsでfoobarをSHA-256でハッシュ化した文字列」の部分にlambdaの「Execution results」のタブに「foobar」をSHA-256アルゴリズムでハッシュ化した文字列が出力されているのでコピーして貼り付ける。
-
筆者の場合貼り付けた後のPHPのコードは下記のようになる。
<?php $str = 'foobar'; $hash = 'c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2'; $calculatedHash = hash('sha256', $str); if ($calculatedHash === $hash) { echo 'valid!'; } else { echo 'invalid!'; } ?>
-
上記を実行すると「valid!」と出力されたのでチェックが通ったことになる。