2017-04-03 13 views
1

ノードモジュールCryptoとExpressを使用して、クエリ文字列とフォーム名の難読化を提供しています。無効な文字を検出するノードExpress正規表現

'use strict'; 

var algorithm = 'aes-256-ctr' 
    , crypto = require('crypto') 
    ; 

var enc = function(string, key){ 
    var cipher = crypto.createCipher(algorithm, key); 
    var buff = Buffer.from(string, 'utf8'); 
    return Buffer.concat([cipher.update(buff), cipher.final()]).toString('hex').toUpperCase(); 
}; 

var dec = function(string, key){ 
    var decipher = crypto.createDecipher(algorithm, key); 
    var buff = Buffer.from(string, 'hex'); 
    return Buffer.concat([decipher.update(buff), decipher.final()]).toString('utf8'); 
}; 

使用されるキーはランダムセッションGUIDである可能性が高いため、クエリ文字列はそのセッションが有効である限り有効です。

問題セッションGUIDが文字列をエンコードしたものと異なる場合、関数は引き続き16進文字列を復号化しますが、結果は無効になります。

文字列に無効な文字が返されたかどうかを検出するための正規表現文字列や、元のキー以外の文字列をデコードするために別のキーが使用されたかどうかを判断する他の方法はありますか?

すぐに到着するreqを調べ、req.queryまたはreq.formを解読する必要があるかどうかを判断し、クエリ文字列が正しく解読されたかどうかを調べようとします。

答えて

2

これは私がやることです。 'abc'などの裸の文字列を暗号化するのではなく、暗号化して正しく復号化したことを伝える文字列がある場合は、という文字列のオブジェクトのJSON表現を暗号化できます

あなたが好きな機能で、このような文字列をエンコードすることができます

let encode = string => JSON.stringify({string}); 

は今encode('abc')文字列を返します:'{"string":"abc"}'

あなたは文字列を復号化し、JSON.parse()それをし、それは私の場合の結果n stringプロパティを持つオブジェクトであれば、ランダムなガベージではないことがかなり確信で​​きます。無効なJSONの正しい正しいJSONの文字列が、未定義を返します

let decode = json => { try { return JSON.parse(json).string; } catch (e) {} }; 

:あなたはこのような関数で結果をデコードすることができます復号化した後

もちろん、さまざまな方法でこれを行うことができますが、これはコードをそれほど変更する必要がない非常に簡単な方法です。

より堅牢なソリューションのためには、JWTを使用することができます。

+0

JSONは本当に必要なものではありません。これはすべて必要です。これが達成されているのは、正しく復号化する必要があるカナリアを追加することです。 – zaph

+0

@zaphもちろん、JSONは必要ではありません(そのため、私は「さまざまな方法でこれを行うことができます」)。しかし、JSONはそれほど簡単なことです。それは、他の文字列で文字列に結合し、復号化後にその文字列があるかどうかを調べることができます。ここでは、JSONプロパティのキー名はカナリアとして機能しますが、もちろんさまざまな方法で行うことができます。 – rsp

+0

"Iamacanary"のような文字列を前に付ける(または追加する)ことすら簡単です。最もシンプルな解決法は、一般的に「混乱」するのが一番難しくなります。 – zaph

0

正しいキーを保証する通常の方法が使用されているおよび/または暗号化されたデータが変更されたされた暗号化するために、次にMAC。これは、暗号化されたデータをHMACに導き、暗号化されたデータにHMACの結果を付加することを意味します。暗号化されたデータの復号化(HMACの結果より少ない)が、派生鍵を用いてHMACを介して再度実行され、追加されたHMAC値と比較される。成功した場合は、データを復号化します。それ以外の場合は、キーまたはデータが正しくありません。

これはすべて許容できないオーバーヘッドです。別の方法として、暗号化の前にデータに小さなデータ項目(canary)を追加し、復号化後に値を確認する方法があります。しかし、これはいくつかの攻撃に対して安全ではありません。

関連する問題