ノードサービスでJWT(JSON Webトークン)を作成しようとしていますが、これをPHPサービスでチェックする必要があります。ノード暗号化による暗号化 - PHP openssl_decryptでの復号化に失敗しました
トークンはspec通り作成していますが、私はノードcryptoライブラリを使って署名を暗号化しています。私は、これらの技術間で確実に動作する唯一のアルゴリズムはaes-128-cbc
だから私が使用しているものだと読んだ。
私はmcrypt_decrypt
を使用していくつかの運がありましたが、それでも100%は正しくありませんでしたが、まだ失敗しています。また、そのライブラリは廃止されているので、むしろopenssl_decrypt
を使用しています。これはまったく動作しません。単にfalseを返すだけです。
シークレットと初期ベクトルは、どちらもvarchar(16)型のフィールドにデータベースに格納されているため、両方のコードで同じです。私は16byteのブロックサイズを使用していますので、16byteのシークレットとivにマッチします。
バイナリ形式、16進形式、および64形式のさまざまな組み合わせを試しましたが、openssl_decrypt関数でfalse以外を返すことはできません。
この質問は、ノードの文字列を暗号化してPHPで復号化する方法を説明していますか?あるいは、これらのメソッドの私の現在の使い方に何が間違っていますか?
ノードv7.4.0
var crypto = require('crypto');
var secret = crypto.randomBytes(16);
var iv = crypto.randomBytes(16);
var header = { type:'JWT', alg: 'aes-128-cbc' };
var payload = { iss: 'auth-token', exp: Date.now() + 86400, token: <some uuid> };
var data = new Buffer(JSON.stringify(header)).toString('base64') + '.' + new Buffer(JSON.stringify(payload)).toString('base64');
var cipher = crypto.createCipheriv('aes-128-cbc', secret, iv);
var encrypted = cipher.update(data, 'utf8', 'base64') + cipher.final('base64');
var JWT = data + '.'+ encrypted;
PHPのv7.0.13(もV7.1.1を試してみました)
list($header64, $payload64, $sigEnc) = explode('.', $_POST['jwt']);
$header = base64_decode ($header64);
$payload = base64_decode ($payload64);
$signature = openssl_decrypt($sigEnc, 'aes-128-cbc', $secret, null, $iv); // secret and iv are both straight out of the database
更新
私は今ここに私の目的を変更して使用しましたおそらく正しい方法であるハッシュ。したがって、ノードサービスでは、データベースに格納されているランダムキーを使用して、base64ヘッダーとペイロードのSHA256ハッシュを作成します。 PHPのサービスでは、同じことを行い、ハッシュを比較します。これは私が前に取ったはずのより良いアプローチです。
しかし、Nodeの文字列を確実に暗号化してPHPで復号化する方法はまだありますか?
仕様を正しく実装するライブラリが必要です。あなたは両側をチェックしましたか? –
ライブラリーがありますが、それはかなり簡単なものでは少し残忍に思えます。 –
あなたの仕事を確認できるように、アプリケーションの平文、キー、iv、および暗号文のサンプルはどうですか?また、FITH CoinOp、または別のものですか? – Sammitch