2017-03-23 15 views
0

ノードサービスで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で復号化する方法はまだありますか?

+0

仕様を正しく実装するライブラリが必要です。あなたは両側をチェックしましたか? –

+0

ライブラリーがありますが、それはかなり簡単なものでは少し残忍に思えます。 –

+0

あなたの仕事を確認できるように、アプリケーションの平文、キー、iv、および暗号文のサンプルはどうですか?また、FITH CoinOp、または別のものですか? – Sammitch

答えて

0

ライブラリーがありますが、それはかなり簡単なことが少し難しいようです。

これはかなり簡単ですが、明らかにそうではありません。

暗号化を使用すると、アルゴリズムを自分で最初から実装することが十分に理解されているか、間違ってしまう危険性が高いため試してみることはできません。何も動作していないときと同じように間違いを犯すと十分に悪いですが、動作しているように見えますが、あなたが考えなかった攻撃に対して弱くて脆弱です。

セキュリティを重視する人は、適切なツールを使用してください。ノードでは、持っている:

many more。 PHPの場合

あなたが持っている:

https://jwt.io/を参照してください。詳細、ツール、チュートリアルなどがあります。

ライブラリを使用せずに自分で正しく行う方法を学びたい場合は、それらのライブラリのソースコードを読んでください。これらはすべてオープンソースのフリーソフトウェアです。

+1

私がJWTを使用しているという事実はそれほど重要ではありません。私はさらに、ノード内の文字列を暗号化してPHPで解読する最良の方法は何ですか?私は両方の言語が暗号化と解読の方法を持っているので、このためのライブラリが必要ではないはずです。私は、すでに利用可能な方法を使用するだけで、新しい形式の暗号化を自分で作成することについて話しているわけではありません。 –

関連する問題