2009-05-23 2 views
2

私のプログラムでは、ユーザーのIPアドレスをレコードに格納します。ユーザーにレコードのリストを表示するとき、他のユーザーのIPを譲渡したくないので、SHA1はそれをハッシュします。ユーザーがレコードをクリックすると次に、それは、このようなURLに行く:WHERE内のWHERE

http://www.example.com/allrecordsbyipaddress.php?ipaddress=SHA1HASHOFTHEIPADDRESS 

は今、私はSHA1ハッシュに指定されたIPアドレスですべてのレコードを一覧表示する必要があります。私はこれを試しました:

SELECT * FROM records 
WHERE SHA1(IPADDRESS)="da39a3ee5e6b4b0d3255bfef95601890afd80709" 

しかし、これは動作しません。どうすればいい?
ありがとう、 Isaac Waller

+1

なぜIPアドレス自体の代わりにハッシュを使用するだけですか? – Gumbo

+0

この方法では、クエリを実行するたびにデータベース内のすべてのアドレスのSHA1を計算します。それは驚くほど遅く、膨大な量のCPUを使用します。 – blueshift

答えて

4

クエリが

SELECT * FROM records WHERE ip_sha1 = "..." 

になるよう、私はその後、私はSHA1の計算が正確に一つの場所に起こっていることを確認したい、生IPと一緒にデータベースにIPのSHA1を保存したいですコード内にが含まれているため、複数の場所で若干異なる方法で作業する機会はありません。また、計算に塩を混入する機会があるので、興味のあるIPアドレスでSHA1を計算して手で渡すことはできません。

SHA1ハッシュを格納すると、データベースでは、ip_sha1にセカンダリインデックスを追加して、そのSELECTを高速化することもできます。非常に大きなデータセットがある場合、WHERE句でSHA1を実行すると、データベースはすべてのスキャンですべてのレコードの計算をやり直すとともに、完全なテーブルスキャンを実行します。

+0

+1:DRY(繰り返しはしません)は*キー*の原則であり、データやコードの各キーが一度だけ存在することを保証します。 DRYの重要な部分です。 –

+0

私は生のIPアドレスを自分で必要としますが、一般の人と共有したくありません。 –

+0

@Isaac Waller:IPとそのハッシュの両方をテーブルに保存できます。それにより、検索が迅速になり、トラブルシューティングが容易になります。 – Andomar

0

ハッシュアルゴリズムの出力をMySQLのSHA1()の出力と比較しましたか?たとえば、IPアドレス1.2.3.4の場合は?

3

予期せぬハッシングの不一致が発生するたびに、「\n」などの空白文字列を誤ってハッシュしたためです。

+0

+1右...覚えています – Andomar

7

重要であるかどうかわかりませんが、SHA1ハッシュda39a3ee5e6b4b0d3255bfef95601890afd80709は、空の文字列のよく知られたハッシュです。

これは単なる例ですか、または実際のIPアドレスをハッシュ計算機能に提供するのを忘れていますか?

更新:

ウェブページのコードを小文字でSHA1ハッシュを生成するのでしょうか?

このチェックはMySQLに失敗します。

SELECT SHA1('') = 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709' 

この場合、この使用:成功します

SELECT SHA1('') = LOWER('DA39A3EE5E6B4B0D3255BFEF95601890AFD80709') 

を、。あなたがテーブルにレコードを挿入する際

また、あなたはSHA1ハッシュを事前計算することができます

INSERT 
INTO ip_records (ip, ip_sha) 
VALUES (@ip, SHA1(CONCAT('my_secret_salt', @ip)) 

SELECT * 
FROM ip_records 
WHERE ip_sha = @my_salted_sha1_from_webpage 

は、これはあなたの元IPを返すと、このクエリは、高速に動作するように、ip_shaのインデックス作成を許可します。

+0

これは単なる例でした。 –

3

簡単なことですが、非常に単純な難読化です。可能なIPアドレスは2つしかないので、技術的な知識を持つ誰かがそれを理解したいと思えば、それほど時間がかからない40億のハッシュをすべて計算することで可能になります。これらのIPアドレスの機密性に応じて、プライベートルックアップテーブルを検討することができます。

+1

または少なくとも塩。 – blueshift

0

私は、IPアドレスの暗号化を終了し、他のページでそれらを解読しました。次に、SQLクエリで生のIPアドレスを使用するだけです。また、それはブルートフォース攻撃を防ぐために、Autocracyと言っています。