2010-12-29 10 views
3

いくつかのデータをログに記録するとき、私は異なるIPアドレスから来たデータを特定できるようにしたいと思います。一方、データが公表されるにつれてプライバシーに関する懸念事項については、私は実際のIPを取得できないようにしたいと思います。ですから、IPアドレスを1-1のマッピングを保証する他の文字列にマッピングする必要があります。プライバシーのためにIPアドレス自体を保存せずに一意性のためのIPアドレスを記録する

私が正しく理解していれば、MD5、SHA1またはSHA256が解決策になる可能性があります。私は彼らが必要な処理の点で高すぎないのだろうか?

Perlで実装されている方が良いのであれば、私はどんなソリューションにも興味があります。

答えて

1

Rabin fingerprintingを使用してください。迅速かつ簡単に実装できます。

nビットのメッセージM 、...、M N-1が与えられると、我々は、有限体GF(2)上の1のn- を次の多項式として表示 。

それから GF(2)上の次数kのランダム既約 多項式P(X)を選択し、そして我々は 分割後の剰余R(X)とMの指紋 を定義しますGF(2) 上のp(x)によってf(x)を計算し、 次数k-1の多項式またはkビット数とみなすことができる。これは、あなたが求めるようperfect hash functionまだありませんが、あなたはおそらく、ハッシュから元のIPを機能をクラックして得ることができるという問題に直面するつもりだものを取得すること

注意。ほとんどの場合、フィンガープリントでの衝突の可能性は非常に低いです。

ハッシュ関数を使用すると、ハッシュ関数がわかっている場合、特定のIPアドレスからのログエントリを見つけることは簡単になります。これに対して自分自身を保護したい場合は、ハッシュを暗号化する必要があります。

6

私はMD5が十分に速くて十分だと思います。レインボーテーブル/ウェブルックアップを避けるために、いくつかの一定の文字の塩を追加したいと思うでしょう。たとえば、文字列 "127.0.0.1"にはmd5 f528764d624db​​129b32c21fbca0cb8​​d6が含まれていますが、かなりの数のGoogle検索結果があります。 「szabgab127.0.0.1」、一方、取得する「あなたの検索を - 501ff2fbdca6ee72247f8c61851f17b9 - に一致する情報は見つかりませんでした」(私はこの答えを投稿するまで...)

+0

私はdownvoteに値する何も見なかったので、私はキャンセルするようにupvoted。 –

+0

私はそれが仕事で抗MD5軍だと思います。この特定の目的のために、私はMD5が大丈夫だと思っています(私のdaximの答えを見てください)が、一般的には避けるべきです。 – ysth

0

は⚠それ以上のMD5またはSHA-1を使用しないでください。 articles弱点についての記事を参照してください。

代わりにSHA-2を使用すると、Crypt::SaltedHashは素敵な抽象化を提供します。推奨PerlバインディングはDigest::SHAで、XSを使用しています。

あなたは高価な話をしています。あなたはまだコードをプロファイリングしましたか?コードはまだ書かれていない?それで道はtoo early to think about optimisationです。セキュリティは最初の懸念事項でなければなりません。


編集:コード例@marcogの回答に

use Crypt::SaltedHash; 
my $normalised_string_representation_of_internet_address = '::1'; # or perhaps '10.10.10.10' 

# when you first get an address, make a hash and store it 
my $csh = Crypt::SaltedHash->new(algorithm => 'SHA-512', salt_len => 32); 
$csh->add($normalised_string_representation_of_internet_address); 
my $salted = $csh->generate; 

# later retrieve the hash and see whether it matches 
my $valid = Crypt::SaltedHash->validate($salted, $normalised_string_representation_of_internet_address, 32); 
+1

塩を使用すると、同じIPアドレスが別々のハッシュに異なる時間にマップされます。これにより、ログの目的の1つが無効になります。 –

+0

もちろん、塩はハッシュと一緒に保存されますが、あなたの心配は疑問です。以前これをやったことがあれば、これは非常に明白です。 - これが動作することを示すコードをいくつか追加します。 – daxim

+1

いいえ、パスワードには当てはまりますが、このアプリでは意味がありません。ハッシュされたアドレスが記録された後でIPアドレスを「検証」する機会はありません。 –

1

ビルと@daximログ生成デバイス上のハードコーディングされた秘密鍵を使用して、たとえばHMAC-SHAために、HMACを使用することができます。秘密が漏れてしまった場合、今のところこれまでに与えられたもののように弱くなります。

おそらくもっと単純に、同じ秘密鍵の概念を使用してIPアドレスを暗号化できます。 AESの128ビットブロックサイズは、すべての可能なIPアドレスの1-1マッピングを保証するのに最適です。ちょうどECBモードでAESを使用してください。

0

ハッシュを使用するだけで、誰かがブルートフォース攻撃を行うことができます。

最も簡単なことは、ブルームフィルタを使用することです。特に、http://www.afflib.org/のC++ Bloomフィルタの実装では、Bloomフィルタに任意の文字列を追加し、その文字列が存在するかどうかを調べることができます。ブルートフォース攻撃から守りたいのであれば、偽陽性頻度を上げて10億分の1にするだけです。それであなたは一意になりますが、あなたは見たIPアドレスを知ることができません。

0

もう1つのオプションはCrypt::Eksblowfish::Bcryptです。しかし、それが "より良い"理由は、それが(eks)pensiveなので、どのくらいの費用が調整可能なのかということです。あなたのアプリケーションでは、重複したIPが少なくとも見えたら遅くならないように、暗号化されたIPをキャッシュすることができます。

関連する問題