2017-04-13 18 views
1

지불을 허용하는 모바일 앱을 구축 중입니다. 사용자는 자신의 참조 목록 세부 정보를 입력하고 지불 정보는 HTTPS를 통해 소매점의 POS 시스템에 제출됩니다. POS는 지불을 직접 처리하고 실제 신용 카드 정보가 필요하므로 카드를 저장할 Stripe와 같은 서비스를 사용할 수 없으며 지불을 처리 할 토큰을 돌려 줄 수 없습니다.PCI 호환 방식으로 iOS/Android에 신용 카드 정보를 저장하는 방법

앱의 성격 상 사용자는 정기적으로 결제를하므로 편의를 위해 참조 정보를 저장하고 싶습니다. 그러나 이것은 반복 청구가 아니므로 사용자는 의지대로 트랜잭션을 시작합니다. 그러므로 나는 서버에 중앙 CC를 보관할 필요가없는 나는이 방법을 사용하여 각 사용자의 기기에 개별 카드를 저장하는 고려 중이 야 : 사용이 AES256을 사용

  • 수집 CC 수 & 유효 기간
  • 암호화를 키와 CVC
  • 는 다음의 (a) 데이터가 키 체인에서 촬영, 지불을 위해 (안드로이드에 대한 동등하거나) 아이폰 OS 키 체인에서 암호화 된 데이터
  • 를 저장 (CVC는 저장되지 않음)
  • (B) 사용자는 CC 정보를 해독하기 위해 CVC를 입력해야합니다.

사용자가 CVC를 알고 있다면 어쨌든 카드를 소지하고 있으므로 장치를 해킹 할 필요가 없다는 아이디어가 있습니다.

암호화의 경우 RNCryptor lib을 사용하려고합니다. 주요 기능 중 하나는 암호화 및 인증을 위해 공통 암호를 두 개의 256 비트 키의 암호로 '임의의'바이트 시퀀스로 자동 변환하는 것입니다. 키 스트레칭은 10k 라운드 PBKDF2를 통해 구현됩니다. 구현 세부 사항은 링크에 있지만 짧은 : PBKDF2으로 연신

  • 비밀

    • AES-256 암호화
    • CBC 모드
    • 암호화-다음
    • 랜덤 IV를 염석 비밀 - 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 아이폰 OS 키 체인 (또는 드로이드 상당)에 암호화 된 CC 정보에는 장치 잠금 암호가 활성화하지 않는 경우, 그것은 중요 않습니다를 storying? 내 생각에, 정보는 이미 AES256 암호화되어 있으며, 키 체인의 암호화가 없으면 장치에 저장할 수 있습니까?

    많은 수의 CC 번호를 저장하는 중앙 서버가 없다는 것을 고려하면이 경우 PCI 준수 섹션과 관련이 있습니까? 나는 PCI 사양을 읽는 시도하지만 문서는 미로를 탐색 할 :(

  • +0

    최소한 iDevice의 암호가 활성화되어 있는지 확인해야합니다. – zaph

    +0

    Aes256은 256 비트 키가 필요하지만 cvc 코드는 10 비트의 정보 만 포함합니다. cvc 코드를 키로 사용하면 무차별 대입은 즉시이를 파기 할뿐만 아니라 프로세스에서 cvc 코드를 유출합니다. –

    +0

    iOS 측에서 ApplePay를 사용하지 않는 것이 맞습니까? – Bobson

    답변

    3
    1. 을의 Ebbe은 키로 단지 CVC를 사용하여 지적 하듯이, 심지어 1000가 확보되지 PBKDF2와 CVC에서 파생 된 가능한 다른 키가 있어야합니다.

    2. 날짜는 알려진 형식 및 제한된 값을 갖고 있기 때문에 부분 침대로 작동하며 필드 구분 기호 또는 필드 표시기와 같은 다른 침대는 포함하지 않도록주의하십시오

    3. 신용 카드 계좌 번호 확인 수표는 또한 유아용 침대입니다.

    4. 키 체인을 보호하려면 사용자가 장치 잠금 암호를 입력해야합니다.

    5. 탈옥 및 루트 장치는 피해야하며 판단하기가 어렵습니다.

    6. 트랙 # 2 데이터가 아니라 CC# 및 만료 날짜 만 저장되고 PCI 표준으로 암호화되어 있으면 확인해야합니다.

    7. PCI Point to Point Encryption Standard을 참조하십시오. PCI 사이트에서는 무료입니다. 표 2, 응용 프로그램 개발자를 참조하십시오.

    8. 마지막으로 PCI 감사관을 통해 귀하의 계획을 검토하십시오.이 정보는 제공된 정보와 평가가없는 "최상의 정보"일뿐입니다. 영업 이익의 의견에 따라

    업데이트 :

    시도하는 1000 개의 CVC가 있습니다. RNCryptor는 CVC 시도 당 ~ 200ms가 걸릴 것입니다. 즉, 1000 초가 ~ 4 분 안에 시도 될 수 있습니다. RNCryptor에는 인증 기능이 있으므로 올바른 CVC를 시도하면 즉시 알 수 있습니다. 이것은 최소한 안전하지 않으며 인증은 사용자에 대해 작동합니다.

    인증이 없으면 유아용 침대에 의존해야합니다. 첫 번째 침대는 체크 디지트로, 100을 나가는 ~ 900 CVC를 배제합니다.

    하지만 암호화 된 형식에 따라 실제로 악화됩니다. 잘못된 키로 암호 해독하면 기본적으로 임의의 바이트가 반환됩니다. CC# 및 날짜가 문자열 인 경우 결과 문자열이되는 확률은 사실상 zip이므로 정확한 암호 해독이 즉시 알려집니다. 가장 좋은 방법은 CC#을 큰 정수로 변환하고 날짜를 숫자 일 + 연도로 변환하고 암호화하는 것입니다. 그러나 그 때조차도 체크 디지트 침대와 해독 유효성을 검사하는 데 사용할 유효한 날짜가 있습니다. 실제로 암호화에 만료일을 포함하지 않는 것이 더 안전합니다.

    결국 CVC를 키로 사용하면 보안이 유지되지 않으므로 훨씬 더 긴 키가 필요합니다.

    키 체인은 장치 소유자로부터 내용을 보호하지 못하며 실제로 장치 소유자는 누구든지 액세스 할 수 있습니다. 패스 코드는 액세스가 결정되어 장치 소유자가됩니다.

    +0

    감사합니다. @zaph, 귀하의 의견은 일부 누락 된 세부 사항으로 내 질문을 업데이트하는 데 도움이되었습니다. 나는 3 개의 CVC 숫자 중에서 '좋은 키'를 만들기 위해 RNCryptor를 사용하고 있습니다. 나의 이해는이 lib가 PBKDF2 스트레칭의 10k 라운드를 수행하여 통계적으로 임의의 바이트 두 개의 256 비트 키를 생성한다는 것입니다. 그러나 3 자리 숫자만으로 RNCryptor를 뿌리면 충분히 안전 할 것이라고 판단 할만큼 충분히 수학을 이해하지 못합니다. 그것에 관한 어떤 생각? iOS 키 체인에 대해서는 민감한 정보가 이미 AES256으로 암호화되어 있으므로 장치 잠금 암호가없는 경우 중요합니까? 관두에 피하는 좋은 팁! 감사! – DTs

    +0

    답변 업데이트를 참조하십시오. – zaph

    +0

    자, 그럼 이것을 깨뜨리려고하면 이렇게 할 수 있을까요? (a) 사용자가 패스 코드없이 (또는 알려진 패스 코드로) 장치에 액세스하고, (b) 장치를 탈옥 시키며, (c) 암호화 된 데이터를 키 체인에서 프로그래밍 방식으로 추출하고, (d) 자신의 컴퓨터에서 암호를 강제로 시도합니다. 어떤 경우 키 스트레칭과 관련이 없습니까? CVC를 정적 긴 문자열 (사용자가 볼 수 없도록)로 변 경한 다음 암호 해독 중에 동일한 변이를 사용하면 어떻습니까? 그런 다음 누군가가 내 코드를 리버스 엔지니어링하여 키 - 풍부화 및 메커니즘을 이해해야합니다. 예 : – DTs