web-dev-qa-db-ja.com

カード番号をハッシュするには何ラウンド使用すべきですか?

保存された支払い方法のいずれかを使用してログインせずに行われた支払いを、保存された支払い方法に関連付けたいと考えています。例えば。クレジットカード1を使用して雑誌1の定期購入を購入した場合、クレジットカード1を使用して雑誌2の別の定期購入を購入します(もう一度)、アカウントにログインすると、両方の雑誌が同じ支払い方法を使用して購入されたことが示されます。 。 (どちらも、たまたま同じ最後の4桁で終わる2つの別々のカードを使用して購入されたわけではありません。)

これらの2つのチェックアウト中にはログインしていないため、既存の支払い方法を選択する方法はありません。内部的には、この支払い方法が以前に使用され、「重複」していることを認識する必要があります。

この問題に対する私の解決策は、Blowfishを使用してカードの詳細をハッシュすることです。

private static String hashSalt(Long userId) {
    final Long rounds = 10
    String userHash = sha1("$userId" + GLOBAL_SALT).substring(0, 16)
    return "\$2a\$$rounds\$$userHash"
}
private static String mergeCardDetails(String number, String cvv, String expirationMonth, String expirationYear) {
    return "card:$number:$cvv:$expirationMonth:$expirationYear"
}

hash = BCrypt.hashpw(mergeCardDetails("4111111111111111", "123", "05", "22"), hashSalt(userId))

現在、ラウンドカウントは10に設定されています。しかし、これは カード番号の検索スペースが非常に少ない であるため、非常に少ない数値です。

私の質問ですが、今日のカード番号のハッシュには何ラウンドが適切ですか?

将来的には、ラウンド数を増やす必要があり、その結果、支払い方法が重複することになります...

3
Chris Smith

CVVとともにカードの詳細をハッシュしているようです。それは悪いです、非常に悪いです。それをしないでください。ずっと。そして、正しい方法で間違ったことをする方法はありません。

「人は正しいことを間違った方法で行うかもしれません。しかし、彼は正しいことを間違った方法で行うことはできません。間違ったことを行う正しい方法はありません。」src

1秒あたり数百万のハッシュを試すことができる非常に安価な ハッシュクラッキングリグ が世界中にあります。有効な銀行または発行体がいくつかあることを考慮に入れると、ハッシュの解読は非常に高速に実行できるため、最初の6桁は検索スペース全体ではなくテーブルから取得されます。 1つのデータベースリークとすべての財務データは、アンダーグラウンドフォーラムで入手できます。

利便性を少し高めるためにセキュリティを危険にさらさないでください。クライアントがカードをもう一度入力したり、Paypalにログインして支払いを行ったりするのは難しくありませんが、すべてのカードデータが漏洩し、カードをキャンセルして再発行する必要があることを知らせるメールを受け取った場合は、ひどくなります。詐欺的な購入を見つけるために彼らのアカウントに目を向けてください。

支払い情報を保存しないでください。支払いゲートウェイで処理します。彼らがカードのデータを誤って処理した場合、それはあなたではなく、彼らにあります。

カードデータを保存しないでください。ハッシュ化されているかどうかにかかわらず、暗号化されたテキストまたは平文のCVVを平文またはbase64などの方法で保存しないでください。


クラッキング時間のほんの少しの数学。

最初の6桁は発行者IDです。 100万に満たないので、テーブルを調べてすべてのテーブルを取得し、最も一般的なものを選択できます。バンクオブアメリカ、シティバンク、HSBC、チェイス。最初の6桁は約100になります。

MasterCardの場合、次の9つの番号はアカウント番号であり、最後の桁は確認桁です。ハッシュ関数でスローするよりも最後の1つの方法で速く計算できるため、1,000,000,000の可能なアカウント番号と約100の可能な発行者があり、合計で10になります。11 可能なカード番号。

ハッシュリグ で8x Nvidia GTX 1080を使用すると、クラック 105100 OpenBSD bcrypt ハッシュ、1秒あたりの作業係数が5で、使用したパラメーターがわかりませんあなたのbcrypt計算では、あなたがOpenBSD開発者と同じくらいうまくやったと考えましょう(そして彼らはそれでかなり上手です)。

この数値を使用すると、単一のリグが以下の関連する検索スペースをクラックできます。

100,000,000,000 numbers at 105,000 per second = 950k seconds
950k seconds = 264 hours = around 11 days

攻撃者は11日間でデータベース上のすべてのカードをクラックするわけではありませんが、主要な発行者からのすべてのカードを2週間未満でクラックします。あなたの仲間の暗号通貨マイナーからいくつかのイーサリアムマイニングリグを借りれば、攻撃者はこれを1日で解読できます。

38
ThoriumBR

ThoriumBRの答えに同意します。さらにいくつかの詳細と提案があります:

あなたは動いているターゲットを攻撃しようとしています。 「何ラウンドで十分ですか?」ハードウェアの可用性が変化すると、答えが変わる質問です。したがって、パスワードハッシュ設定に関しては、多くのシステムに、時間とともにハッシュラウンドを自動的に増加させる方法があります。最小ラウンド数はいくつですか?いくつかの数学は確かにそれに答えることができます(強力なパスワードの平均エントロピーとクレジットカード番号の平均エントロピーを比較し、それに応じてコストを増やすことによって)。しかし、答えは「たくさんのラウンド」だと思います。さらに、あなたがしようとしていることが根本的に欠陥があるのではないかと心配です。

この質問に「PCI-DSS」というタグを付けたので、明らかにこれが関連する懸念事項です。一般に、PCIコンプライアンスを達成するための最良の方法は、サーバーにクレジットカード番号を持たせないことです。クレジットカードの詳細全体をハッシュしているということは、それらの番号を持っているということです。クレジットカード番号が実際にサーバーを通過するときのPCIコンプライアンスの規則は正確には覚えていませんが、それははるかに複雑であり、法外に高くつくことさえあることは知っています。やらない方がずっといいです。

さらに、パスワードをハッシュ化する方法は通常のことではなく、顧客のセキュリティリスクを高めます。ソルトはランダムな文字列である必要があります-ユーザーIDに関連付ける必要はありません(これの全体のポイントは匿名ユーザー間のクレジットカードを照合することであるため、奇妙に思えます)。また、クレジットカード番号だけでなく、有効期限とCVCをハッシュに含めるのはひどい考えです。達成したいことを達成するには、本当にクレジットカードの詳細が必要です。それ以上の情報があれば、攻撃者はハッシュを取得し、ブルートフォースに成功した場合にクレジットカードの詳細全体を取得できます。

これは、「独自のセキュリティを導入しないでください」というアイデア全体が出てくるようなものです。私を許してしまえば、重要な顧客データを保護することに関して、あなたは経験レベルの少し外にいるかもしれません。顧客のクレジットカードを照合するための独自のシステムを考案することは、誤って多くのクレジットカード番号を漏らし、ビジネスに多くのトラブルを引き起こす良い方法のようです。

要約すると、ThoriumBRの答えを聞くのが最善の方法です。これは行わないでください。顧客のUIが少し改善されても、クレジットカード番号が漏洩するリスクが高まるだけの価値はありません。これを行う場合は、クレジットカード番号を一意で安全な文字列に変換できるPCI準拠のクレジットカードプロセッサを見つけてください。その後、データベースに安全に保存して比較できます。私の頭の上のすぐ上の例はストライプです。

そしていくつかの数字

今朝もいくつかの数字を見ていました。私はこの記事が関連していると思いました:

https://www.pxdojo.net/2015/08/what-i-learned-from-cracking-4000.html

この人は、(おそらく)中低レベルのハッシュ設定を使用して、Ashley Madisonデータダンプからパスワードをクラックする方法について説明しています。彼らはコストファクター12のbcryptを使用しました(暗号化のラウンド数は2^cost_factor、つまりコスト係数12 = 2^12 = 4096 bcryptのラウンド(ただし、実際にそれを試す場合は、その事実を完全に確認してください)。この男たちがリグを解読したとき、彼は毎秒156ハッシュのハッシュレートを持っていました。 ThoriumBRは、クレジットカード番号のエントロピーをかなりうまく概説しています(約1e11可能性のあるクレジットカード番号)。つまり、上記のリンクのガイと同じハッシュリグ設定で1つのクレジットカード番号をコスト係数12で解読するには、約20年かかります。ソルティングは、各ハッシュを個別にブルートフォースする必要があることを確認します。

もちろん、これらの数値は突然変わる可能性があります。私の例で引用したハッシュ化の設定は、間違いなく最上位の設定ではありません。また、誰かがbcryptの効率的なASICを考え出した場合、状況は劇的に変化する可能性があります(まだあるとは思いませんが、間違っている可能性があります)。

13
Conor Mancone