1

Railsアプリで検証を開発する方法を考えています。この検証では、すべてのクレジットカードを使用してアイテムを購入できるように、ユーザーが特定のトランザクションに使用するクレジットカードがシステム内で一意であることを基本的に確認します。すべてのユーザーのアプリケーション全体で、いつでも1回だけ

この制限の背後にある考え方は、このアプリが時間に敏感なプロモーション取引を実行することがあるということです。私たちはこれらの取引に対して「クレジットカードごとに1回の購入」システムを確立するために最善を尽くしたいと考えています。

クレジットカード番号をハッシュしてそのハッシュをデータベースに保存し、新しい購入のたびに相互参照することを考えていました(したがって、支払いゲートウェイは実際の番号を保持し、ハッシュはDBに保持します) 、しかし、さらなる調査では、これは悪い考えのようです。

それで、私は製図板に戻って、新しいアイデアを探しています。私ができる限りPCIに準拠しながら、この問題への優れたアプローチを知っている人はいますか?

私はRails3で開発しており、ActiveMerchantを使用して、支払いゲートウェイであるAuthorize.netと統合しています。

4

5 に答える 5

1

確かに、一部のハッシュは悪い考えです。セキュリティが低いか、インターセプトがあるか、レインボーテーブルが一般的に使用されているためです。これは、すべてのハッシュが悪い考えであることを意味するわけではありません。相互参照する唯一の方法は、情報を一意かつ予測可能に識別する方法です。PCIが特に禁止していない限り、ハッシュは依然として道のりです。

ハッシュをソルトするようにしてください。これにより、レインボーアタックが防止されます。または、少なくともレインボーアタッカーがソルトを念頭に置いてテーブルを作成する必要があります。特に、ソルトを適度に安全に保つことができる場合は、{生成するにはソルトが必要であるため、コード内のどこかにあることを意味するため、合理的にのみ言います}。

適切なアルゴリズムを選択する

MD5は今では悪名高く、あらゆる種類の言語で実装されていますが、非常に一般的であるため、事前に作成されたレインボーテーブルを見つけることもできます。ハッシュの生成も非常に高速です。システムはおそらく少量の遅延を許容し、はるかにプロセッサを集中的に使用するハッシュを使用できます。これにより、レインボーテーブルを生成するコストがはるかに高くなります。たとえば、 Tigerアルゴリズムを確認してください。

複数回ハッシュする

関連するデータポイントが複数ある場合、複数のハッシュを使用すると、レインボー攻撃を実行するのが非常に難しくなります。例:Hash(Hash(Card#+ salt1)+ ExpireDate + salt2)-カード番号と生成日(簡単)の両方の知識が必要ですが、簡単にリバースエンジニアリングすることはできません(すべてのカードにレインボーが必要です) #*すべての有用な有効期限+両方の塩の知識)。

編集:(あなたのコメント)

適度に安全:暗号化された接続(SFTP、SSH)を介してのみ送信し、暗号化されていない状態で保存しないでください-ライブ/反復コピーとバックアップコピーを含め、ファイルをWebツリーの外部にソルトとともに保持します(直接アクセス/誤ってリリースすることはできません) )、ファイルのアクセス許可が可能な限り制限されていることを確認します(グループ/グローバルファイルアクセスを許可しないでください)。

ランダムな値をハッシュにスローする動的ソルトは、レインボー攻撃を減らすのに最適です-そのランダムな部分をハッシュ値とともにテーブルに保存します-レインボーを構築するときは、動的ソルトごとに1つ構築する必要があります。ただし、ニーズに応じてこれを行うことはできません。2回目にハッシュを作成するときに使用する適切なランダムソルトを知っている必要があります(そうしないと、2回目のカードの使用でインターセプトを取得できません)...予測可能/繰り返し可能である場合は、数値の一部に基づいて動的ソルトを作成する必要があります。これは、事実上、別のデータポイントを使用した複数のハッシュが行うことです。データポイントが多いほど、この方向にハッシュできます。たとえば、CVVがある場合(3ハッシュ)、または一度に8桁をハッシュする場合(合計3ハッシュ:) hash(hash(hash(1..8+salt1)+9..16+salt2)+expDate+salt3)

ベストハッシュそれは動くターゲットですが、security.stackexchangeについては良い議論があります。これはSHA-512を指しています。

于 2012-02-03T21:44:42.523 に答える
1

オンラインであなたの本当のクレジットカード番号を偽造することは、これが起こらないようにするための最良の方法です。シティバンクのクライアントはログインして、すべてのアカウントで提供されているこのツールを利用できます。オンラインで使用するための番号と有効期限を生成するだけで、今のところすべて問題ありません。

于 2012-02-04T14:53:35.860 に答える
0

ユーザーは複数のアカウントに登録できます。

ただし、ユーザーの履歴を確認し、購入ごとにアドレスごとに1つのアイテムを適用することで、問題はないでしょう。ユーザーの名前、誕生日、その他の識別情報によって制限することもできます。

ちなみにクレジットカードの情報も変わる可能性があります。実際には、一意の番号が付いた100枚のギフトクレジットカードを購入するのは非常に簡単なので、細かなレベルまで監視したい場合は...ccだけでできるとは思いません。数字

于 2012-02-03T21:40:52.980 に答える
0

「ユーザーごとに1回の購入」システムが必要な場合は、ユーザーが特別購入アイテムを購入しようとするたびに、ユーザーの購入履歴をチェックして、以前に購入したことがないことを確認してみませんか。

于 2012-02-03T21:32:21.507 に答える
0

あなたは間違った方向を見ていると思います。カード、IP、配送先住所の最後の4つを確認します。少数のユーザーが最後の4&ipソリューションをゲームした場合の損害に対して、そのデータを保存するリスクはそれだけの価値がありません。(彼は購入の性質を知らないと言います。)

アドレスが収集されないため...最初の4、最後の4、および4桁の有効期限(もちろんすべてハッシュ化)は、カードが1回だけ使用されるようにするために必要な一意性を提供する必要があります。

于 2012-02-03T22:02:19.647 に答える