これについて以前に質問されたことはありません。それをどのようにフレーズするかについて完全には分かっていなかった。(Redis)クライアント全体を簡単にラップする方法
とにかく、解決しようとしている問題から始めます。 私たちのアプリケーションでは、npm redisモジュールを使ってRedisにデータをキャッシュしています。クライアントを初期化してビジネスロジックで利用可能にし、直接使用します。 しかし、私たちがキャッシュするデータを暗号化する必要があります。したがって、すべての暗号化/復号化ロジックをメインのビジネスロジックに入れるのではなく、すべての呼び出しに暗号化/復号化のステップが含まれるようにクライアントを単純にラップすることができればより良いと思っていました。 問題は、Redisクライアントが、エクスポートされた関数(set、hset、hmset、setexなどなど)全体をヒープしているため、個々の関数を個別にオーバーライド/ラップするのが苦労することです。
私の質問は、クライアント全体を包む方法があるということですか?そのため、クライアントの関数のいずれかが呼び出された場合、あらかじめ暗号化/復号化を実行してから、クライアントの独自の関数を呼び出す前処理関数が呼び出されます。
など。
ただし、上記の内容は、redisクライアントのエクスポートされた機能ごとに自動的に発生しますか?
これもやはり初期の考え方なので、これを行うのは意味がないかもしれません。特定の機能に依存する特定の動作を決定する必要があります。例えば暗号化を呼び出し、それを復号化する。 しかし、上記のことがきれいな方法で可能かどうか疑問に思っていたと思いますか?たとえ各クライアント呼び出しのログや関数に依存しない単純な汎用関数であっても。
編集: 私がやっていることを試してみようと思っています。 私たちは方程式の暗号化を取る場合。 動的にエクスポートされた関数名を持つことは可能ですか? 「foo」という除き、次のような 何か、動的であり、同じ名前の関数をエクスポートしredisClientを呼び出すために使用することができます:
exports.myClient.foo = function(){ //where foo can be any value?
genericFunction(arguments);
redisClient[foo].apply(arguments)
}
私は、あなたが並行性の安全性にどのくらい依存しているかにかかっていると思います。あなたの暗号化ラッパーが競合状態にあなたのアプリを公開するならば、あなたはポイントを逃すでしょう。あなたはLuaスクリプトを使うことができますが、AFAIK Luaは暗号化にあまり役立たず、あなたが言及したようにそれぞれの方法をラップする必要があります。あなたはデータを "輸送中"または "休憩中"で暗号化する必要がありますか? – ptrk
暗号化は、キャッシュ内のデータを休止するためのものです。トランスポートはTLSで保護されていますが、キャッシュが侵害された場合は、コンテンツを暗号化したいと考えています。 Azureをプラットフォームに使用しており、KeyVault暗号化サービスを検討しているため、アプリケーション側で暗号化を行う必要があります。これは、KeyVaultの暗号化アプローチが本質的に外部のhttpリクエストであるため、重要なパフォーマンスヒットを持つ可能性があると推測しているので、変更される可能性があります。 – Mitch
2番目の考えでは、それぞれのメソッドを別々に扱うことなくredisを包み込む簡単な方法はありません。彼らはさまざまなパラメータと動作を持ち、インクリメントを想像してください - 暗号化されたデータを安全に増やしますか?そうでなければ、あなたは完全な処理(get-> decrypt-> increment-> encrypt-> put)を必要とし、それでもアトミックなままにしておいてください。どのように赤字を認識せずに、ビジネスロジックに近いところで暗号化を抽象化するのはどうでしょうか?おそらくそれのすべてがこの安全なものである必要はないでしょうか? – ptrk