2017-04-13 3 views
1

支払いを受け付けるモバイルアプリを構築しています。ユーザは、CCの詳細を入力し、支払い情報は、HTTPSを介して小売業者のPOSシステムに提出される。 POSは支払いを直接処理し、実際のクレジットカード情報を必要とするため、カードを保管するStripeのようなサービスを使用することはできず、支払いを処理するためのトークンを返すことはできません。iOS/Androidのクレジットカード情報をPCIに準拠して保存する方法

アプリの性質上、ユーザーは定期的に支払いを行うため、利便性のためにCC情報を保存したいと考えています。ただし、これは定期的な請求ではなく、ユーザは自由に取引を開始します。そこで私は、サーバー上で一元CCを維持する必要はありませんし、私はこの方法を使用して各ユーザーのデバイス上の個々のカードを保存検討している:

  • CC番号&有効期限
  • を使用して、AES256を使用して暗号化収集支払いを行うためのキーとしてCVC(CVC保存されていない)
  • その後のiOSキーチェーン(またはAndroid向けと同等)で暗号化されたデータを保存
  • 、(a)のデータはキーチェーンから取り出し、そして
  • (Bさ)ユーザはCC情報を解読するためにCVCを入力する必要があります

ユーザーがCVCを知っていれば、おそらくカードを持っている可能性があるので、デバイスをハッキングする必要はありません。

暗号化については、RNCryptor libの使用を検討しています。その主な特徴の1つは、暗号化と認証のために、共通のパスワードを2つの256ビット鍵の暗号的に「ランダムな」バイトシーケンスに自動的に変換することです。鍵の伸張は、PBKDF2の10kラウンドを通して実行されます。実装の詳細は、リンクではありますが、簡単に言えば:PBKDF2

  • 暗号化し、その後、
  • ランダムIV
  • を塩漬けパスワードでストレッチ

    • AES-256暗号化
    • CBCモード
    • パスワードハッシュHMAC


    質問:

    わずか3 CVC桁とRNCryptorのキー・ストレッチの実装を播種した場合、私は判断することがよく十分な数学を理解していないが、統計学的にランダムに十分なキーを生成します。私は、RNCryptorが安全を保つために必要なパスワードの仕様に関する文書を見つけることができませんでした。それについてのいかなる考えも認められるでしょう。このLIBを使用すると、このように簡単です:

    // Encryption 
    NSData *data = ... 
    NSString *password = @"Secret password"; 
    NSData *ciphertext = [RNCryptor encryptData:data password:password]; 
    
    // Decryption 
    NSError *error = nil; 
    NSData *plaintext = [RNCryptor decryptData:ciphertext password:password error:&error]; 
    if (error != nil) { 
        NSLog(@"ERROR:%@", error); 
        return 
    } 
    // ... 
    

    AES256のiOSキーチェーン(またはドロイド同等)の暗号化 CC情報なしデバイスロックパスコードが有効になっていない場合、それは問題ではないのstorying?私の考えは、情報はすでにAES256で暗号化されていますが、キーチェーンの暗号化がなくてもデバイスに保存できますか?

    多くのCC番号が格納されている中央サーバがない場合、PCI準拠のセクションはこの場合に関係しますか?私は、PCIの仕様を読んでみましたが、ドキュメントには、迷路をナビゲートするために:(

  • +0

    少なくとも、iDeviceにパスコードが有効になっていることを確認する必要があります。 – zaph

    +0

    Aes256は256ビットのキーを必要としますが、cvcコードは10ビットの情報しか含んでいません。もし、cvcコードをキーとして使用するならば、無理矢理、これは即座に破られるだけでなく、その過程でcvcコードも漏れるでしょう。 –

    +0

    これはApplePayがiOS側のものではありませんか? – Bobson

    答えて

    3
    1. をEBBEがキーとしてだけでCVCを使用して指摘するように、だけでも1000年があり、セキュリティで保護されていないPBKDF2とCVC由来しています

    2. 日付は、既知の形式と制限された値を持つため、一部のベビーベッドとして機能します。フィールドセパレータやフィールドインジケータなど他のベビーベッドも含めないように注意してください

    3. クレジットカード口座番号確認小切手桁もベビーベッドです

    4. キーチェーンが安全であるためには、ユーザーがデバイスロックパスコードを入力している必要があります。

    5. 脱獄されたデバイスは避けなければなりません。

    6. トラック#2のデータではなく、CC#と有効期限だけが保存され、PCI規格に暗号化されていればOKです。

    7. PCI Point to Point Encryption Standardを参照してください。PCIサイトでは無料です。表2、アプリケーション開発者を参照してください。

    8. 最後に、あなたのスキームをレビューするためにPCI監査人を取得します。これは提供された情報とスルー評価なしの「最良の情報」です。

    OPさんのコメントに基づいて更新:

    しようとする1000のCVCがあります。 RNCryptorはCVC tryごとに約200msかかるでしょう。つまり、1000分のすべてが〜4分で試すことができます。 RNCryptorには認証があるので、正しいCVCが試されたときに即時に認識されます。これは少なくとも安全ではなく、認証はあなたに対して働いています。

    認証がなければ、ベビーベッドを頼りにする必要があります。最初のベビーベッドはチェックデジットで、100を残して約900のCVCが除外されます。

    しかし、暗号化されているフォーマットによっては本当に悪いです。誤った鍵で復号すると、本質的にランダムなバイトが返されます。 CC#と日付が文字列の場合、数字列である結果のオッズは仮想的に圧縮されるので、正しい解読は直ちに分かります。最善の策は、CC#を大きな整数に変換し、日付を数値の日+年に変換し、これを暗号化することです。しかし、それでもチェックデリートのベビーベッドと解読を検証するのに有効な日付があります。実際には、暗号化の有効期限を含めない方が安全です。

    最後にCVCをキーとして使用することは安全ではないため、はるかに長いキーが必要です。

    キーチェーンはデバイスの所有者からそのコンテンツを保護しません。実際にはデバイスの所有者は誰でもアクセスできます。パスコードはアクセスとその結果デバイスの所有者です。

    +0

    ありがとうございます。@zaph、あなたのご意見は、いくつかの不足している詳細で私の質問を更新するのに役立ちました。私は3つのCVC数字の中から「良いキー」を作成するためにRNCryptorを使っています。私の理解は、このlibは統計的にランダムなバイトの2つの256ビットのキーを生成するためにPBKDF2を10kラウンド伸ばします。しかし、3桁のRNCryptorを播種しても十分安全であるかどうかを判断するには数学を十分に理解できません。それについての考えは? iOSのキーチェーンについて、機密情報が既にAES256で暗号化されているため、デバイスのロックパスコードがないと問題はありますか?ベビーベッドの素晴らしいヒントを避けるために!ありがとう! – DTs

    +0

    回答の更新を参照してください。 – zaph

    +0

    これを実際に破ると、このように動作しますか? (a)ユーザがパスコードなしで(または既知の)パスコードを使用してデバイスにアクセスする、(b)デバイスを脱獄する、(c)暗号化されたデータをキーチェーンからプログラムで抽出する、この場合、キーストレッチは関係ありませんか? CVCを静的な長い文字列(ユーザーからは目に見えない)で変更し、復号化中に同じ突然変異を使用するとどうでしょうか?誰かがコードをリバースエンジニアリングして、キーの豊富さとそのメカニズムを理解する必要があります。たとえば、 – DTs

    関連する問題