2017-03-20 9 views
0

データベース内の特定のテーブルのIDを、データベース内の特定のエントリにアクセスするためにクライアントに返す必要があるRESTfulなサービスの開発に取り組んでいました。私は、自動インクリメントを使用し、直接IDを返すに対して助言ので、私が代わりに次のようにイドを暗号化して送信するために行ってきました -データベースIdの暗号化

SET @secretKey1 = "some key"; 
SET @secretKey2 = CONCAT("some other key", AccountNo); 
SET @encryptedAccountNo = TO_BASE64(AES_ENCRYPT(AccountNo, @secretKey1)); 
SET @encryptedId = TO_BASE64(AES_ENCRYPT(Id, @secretKey)); 
RETURN CONCAT(@encryptedAccountNo, @encryptedId); 

(注意:口座番号がにさらされないように十分にランダムフィールドですクライアント)

プライマリキーとしてUUIDを使用する方が適切でしょうか?もしそうなら、UUIDを十分に使用しているか、それとも暗号化すべきか?

あなたは完全に他のデザインを使用しますか?

また、既存のデザインのセキュリティまたはパフォーマンス面を改善するためのヒントはありますか?私はあなたがそのアドバイスを誤解しているかもしれないと思う

+0

中程度の(12文字)ランダムな文字列のような、予測できないものを使用する方が良いかもしれません。 – tadman

+0

@tadmanランダムな12文字の文字列の場合、どうやって衝突を処理しますか? – ytibrewala

+0

十分に堅牢な乱数生成器を持っていて、あなたの文字列にbase-62のようなものを使用しているなら、3,226,266,762,397,899,821,056の可能なシーケンスがあります。衝突する可能性のないピジョンホール原理を説明することさえある。衝突が心配な場合は、コードを設定して再試行するか、文字列の長さを増やしてください。 – tadman

答えて

0

....

あなたは「私は自動インクリメントを使用し、直接IDを返すに対して助言された」と言う

あなたは確かに必ずIDをチェックしてください。使用する前に、サーバー側を使用するのが正しいです。あなたのAPIは、暗号化されたものに対処する必要がありますよう

は(つまり、そのIDで文書がそれを編集しようとするユーザーに属していることを確認してください)、

が、ID自体を暗号化し、実際には有用な目的を果たしていませんあなたが暗号化されたバージョンを送信して、まったく同じ結果を得ることができるように、(悪意のある)クライアントは暗号化/復号化クライアント側でない限り、セキュリティ上何もしません)...

あなたのセキュリティのコメントはできませんあなたのデータベースロジックの(小さな)部分を見ることからのコード。適切なレビューが必要な場合は、実際にインタラクションを行うコードを投稿する必要があります。

+0

ねえ!入力いただきありがとうございます。まだDAOを作成していない。一度更新が完了します。どのIDを持つ文書が編集しようとしているユーザーに属しているかを正確にチェックすることができますか?ありがとう。 – ytibrewala

関連する問題