2011-12-18 15 views
0

あまりにも意味がないとは思わない。しかし、この方法では、.phpファイルから実際の静的な値を隠すことができますが、mysqlクエリのPHPファイルにそのハッシュ値を保持します。ユーザーのマシンからphpファイルのソースに到達することはできませんが、ファイルのバックアップを作成していて、静的な値がそこにあります。列のハッシュを使用して選択するとこの問題は解決しますが、私は信じています。MySQL:ハッシュで選択することは可能ですか?

しかし、このような関数をクエリ(SQLクエリの値ではなく、選択する列)で使用することが可能であることを示すサンプルやドキュメントは見つかりませんでした。 これは可能ですか?

+3

存在しない問題を解決しようとしているようです。 2番目のソリューションを忘れる...あなたが解決しようとしている問題は何ですか?例えばコンプリータの手袋を作ろうとしているようですね。http://thedailywtf.com/Articles/The_Complicator_0x27_s_Gloves.aspx – scunliffe

答えて

1

単に空の「列」を持つすべての行を選択非常に遅いクエリ。

SELECT * FROM table WHERE MD5(column) = 'd41d8cd98f00b204e9800998ecf8427e' 

これらのクエリをたくさん行っている場合は、MD5ハッシュを列またはインデックスに保存することを検討してください。スクリプトの最後ですべてのMD5計算を行う方がいいでしょう。プロジェクトに余分なサーバーが必要になる日に、Webサーバーはデータベースサーバーよりもはるかに優れていることがわかります。私が正しく理解していれば、あなたは主キーとしてハッシュを使用したい

1

このようにシステムを設定しても、実際の問題は解決されません。あなたはあなたのシステムをより安全にしているわけではありません。あなたはそれをもっと複雑にしています。

秘密の値をソースベースから隠す標準的な方法は、これらの秘密の値を別々のファイルに保存し、そのファイルをソースコントロールに送信したり、バックアップしたりすることです。 PHPコードを使用して秘密の値をロードし、MySQLで直接値を操作します(これを行う方法の1つは、変数/定数を設定する行に沿って "config.php"ファイルなどを保存することです) php - ファイルをインクルードする)。

これは、とにかく質問にお答えします。

MySQLには、実際にはさまざまなハッシュ関数と暗号化関数があります。 http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html#function_md5

あなたはちょうどこのようにそれを選択:

SELECT MD5(column) AS hashed_column FROM table 

その後値が比較でき、私はあなたが探している機能はMD5であると仮定していmd5あなたの質問にタグ付けされているのでhttp://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html

を参照してください。ハッシュには、列の別名 'hashed_column'になります。

またはハッシュに基づいて特定の行を選択する:

SELECT * FROM table WHERE MD5(column) = 'hashed-value-to-compare' 
1

(それはもちろん、将来的には心配するものだ):

INSERT INTO MyTable (pk) VALUES (MD5('plain-value')); 

その後、あなたは知らなくても、ハッシュによって、それを取得したいです何そのハッシュダイジェストがされています。どういうわけかこれは、人々が自分のデータベースとPHPコードのバックアップを盗む場合にはより高いセキュリティを提供することになっている

SELECT * FROM MyTable WHERE pk = MD5('plain-value'); 

?まあ、そうではありません。元の平易な値とハッシュの方法を知っていれば、値をハッシュしなかったのと同じように簡単にデータを見つけることができます。

私は@scunliffeからのコメントに同意する - 私たちはあなたが解決しようとしている正確に何の問題がわからないが、この方法は、それを解決することはできませんように聞こえます。

これは、主キーとしてMD5ハッシュダイジェストを使用することも非効率的です。あなたはCHAR(32)にそれを格納するか、UNHEXでそれをBINARY(16)に格納する必要があります。それにかかわらず、主キーのデータ型としてINTまたはBIGINTを使用することはできません。キー値はより大きな値であるため、より大きなインデックスを作成します。

また新しい行がクラスタ化インデックス内の任意の場所に挿入します。これは他の人のように単純な自動インクリメント整数を使用した場合と同様に、Bツリーの最後に新しい値を追加するよりも高価です。

関連する問題