IT story

누군가 신용 카드 데이터를 저장하고 있습니다. 어떻게 처리하고 있습니까?

hot-time 2020. 12. 31. 22:54
반응형

누군가 신용 카드 데이터를 저장하고 있습니다. 어떻게 처리하고 있습니까?


신용 카드 정보를 안전하고 합법적으로 저장하는 것은 매우 어렵고 시도해서는 안됩니다 . 신용 카드 데이터를 저장할 의도는 없지만 다음 사항을 파악하고 싶습니다.

내 신용 카드 정보가 전 세계의 서버에 저장되고 있습니다. 이 데이터는 (희망적으로) 판매자의 서버에 저장되지 않지만, 어느 시점에서 판매자가 제출 한 데이터로 식별 된 계정을 확인하고 청구하기 위해 저장해야합니다.

제 질문은 이것이다 : 신용 카드 데이터를 저장해야하는 경우 디스크에 데이터를 보호하기 위해 어떤 암호화 전략을 사용할 것인가? 제출 된 신용 카드 정보를 알 수있는 것보다 실시간으로 다소 확인되고 있습니다. 데이터를 보호하는 데 사용되는 암호화 키가 수동으로 입력되고 있는지 의심 스럽기 때문에 암호 해독이 즉시 수행되고 있으며 이는 키 자체가 디스크에 저장되고 있음을 의미합니다. 이와 같은 자동화 시스템에서 데이터와 키를 어떻게 보호 하시겠습니까?


제가 번호를 저장한다면, 저는 방대한 데이터베이스를 가진 거대한 서비스 제공 업체가 될 것입니다. 이 데이터베이스는 여러 캐비닛으로 구성된 중복 스토리지 어레이, 별도의 공간 또는 SAN으로 연결된 별도의 지리적 위치에 분산되어 있습니다. 내 가장 큰 내부 위협은 분산 된 물리적 공장, 낡은 드라이브의 끊임없는 흐름, 기술자, 관리자 및 엔지니어의 일상적인 교대 근무입니다. 엄청난 위협입니다.

따라서 네트워크를 통해 대용량 저장소에 연결되는 물리적으로 격리 된 컴퓨터의 데이터를 암호화합니다. 소프트웨어는 가능한 한 간단합니다 : 암호화 및 번호 확인. 공용 인터페이스와 비즈니스 로직은 다른 곳에 있습니다. 액세스는 별도의 SAN에 기록됩니다.

AES와 같은 것으로 암호화하십시오. 원시 AES 키는 RAM에만 저장됩니다. 키는 서버를 활성화하기위한 고유 한 암호를 가진 각 관리자의 PGP 파일에 래핑됩니다. 신뢰도가 낮은 직원에게는 재해 복구에 사용할 부분 암호를 제공하거나 암호를 볼트 어딘가에 저장할 수 있습니다. 암호화의 경우 각 카드 번호에 대해 고유 한 초기화 벡터 (IV)를 선택하고 해당 IV를 사용하여 번호를 AES 암호화하고 IV 및 암호화 된 번호를 SAN에 저장합니다. 암호 해독은 권한있는 클라이언트 인터페이스를 통해서만 발생합니다. 구매에 사용되는 일반 클라이언트 연결 은 암호 해독을받을 없습니다 .


공급 업체가 귀하의 신용 카드 정보를 처리하고 저장하려면 일반적으로 PCI 인증을 받아야합니다. 요구 사항은 여기에 설명되어 있습니다 . 일부 요구 사항은 매우 간단하고 일부는 모호하고 해석 할 수 있습니다. 프로세스를 진행하는 것은 재미가 없으며 인증을받은 회사가 데이터가 안전하다는 의미는 아닙니다.

그러나 그것은 내가 생각하는 것보다 낫습니다.


보안 조회를 위해 번호 자체보다는 신용 카드 번호의 솔트 해시를 저장하는 것은 매우 쉽습니다. 99 %의 시나리오에서 이것은 빠르고 매우 안전한 저장을위한 충분한 신용 카드입니다.

당신이 정말로 필요하면 가역 (예를 들어 계속 청구) 일부 시나리오에 대한 신용 카드의 암호화를, 나는 안전한 위치에 저장 대칭 키와 함께 갈 것 다른 데이터베이스에 비해. PCI 사양을 살펴본 지 한참 지났지 만 PCI 규격을 준수한다고 확신합니다.

가역적 암호화와 함께 빠른 조회가 필요한 경우 해시 및 암호화 옵션을 모두 사용하십시오.

편집 : 내 대답에 대해 논란이있는 것 같습니다. Integrity.com (PDF)에서 다음과 같은 매우 흥미로운 에세이를 지적하고 싶습니다.

신용 카드 번호 해싱 : 안전하지 않은 응용 프로그램 관행

그것은 신용 카드 데이터의 해시 저장과 관련된 많은 문제를 자세히 설명하지만 그 결론은 내 제안을 확인합니다.

예, 카드의 원시 해시는 안전하지 않습니다. 그것이 우리가 해시를 소금에 절인 이유입니다! 그러나 정적 솔트도 안전하지 않으며 알려진 정적 솔트에 대한 무지개 테이블을 만들 수 있습니다. 따라서 예측할 수없는 방식으로 소금을 다양하게 만드는 것이 가장 좋습니다. 암호의 경우 확인되는 각 암호에 대해 별도의 임의 해시를 사용하는 것으로 충분합니다. 해시 된 암호와 동일한 테이블 / 행에있을 수도 있습니다. 신용 카드의 경우 해시되는 신용 카드의 각 인스턴스에 대해 무작위 솔트가 동일해야합니다. 신용 카드 번호가 거래 당 저장되는 경우 각 거래에 대해 별도의 솔트가 저장됩니다.

이 접근 방식에는 장단점이 있지만 충분히 안전합니다. 장점은 키 관리가 부족하다는 것입니다. 솔트와 해시는 바로 거기에 있으며 해시의 감사 검사를 허용하면서 변경할 필요가 없습니다. 예를 들어 그 신용 카드 해시가이 알려진 신용 카드 번호와 일치합니까?

단점은 검색 중입니다. 많은 거래에서 특정 신용 카드 번호를 효과적으로 검색하는 것은 불가능합니다.

물론, 어쨌든 외부 암호화에이 문제가있을 것입니다. 데이터베이스 자체가 암호화되어 있지 않으면 (일부 데이터베이스 만 지원) 검색을 잘 할 수 없습니다. 그럼에도 불구하고 데이터베이스 또는 테이블 수준에서 암호화하면 검색 효율성이 크게 감소합니다.


지난 몇 번 신용 카드 결제로 작업했을 때 실제 CC 정보를 자신의 서버에 저장 한 적이 없습니다. 결제 게이트웨이가 처리하도록합니다. 당신이 얻은 것은 신용 카드가 여전히 유효하고 요청 된 현금이 있는지 확인하는 데 사용할 수있는 transactionID였습니다. 그런 다음 실제로 구매 한 물건을 포장하면 결제 게이트웨이에 캡처 명령을 내립니다.

이 접근 방식은 사이트에서 CC 지불을 통합하는 프로세스를 크게 단순화했습니다. 알아야 할 것은 특정 고객의 transactionID 뿐이었기 때문입니다. 이 과정은 원 클릭 쇼핑에 대한 CC 정보를 유지하는 아마존의 "속임수"를 허용하지 않았습니다. transactionID가 손상된 경우에는 결제를 조기에 수령하거나 거래를 모두 취소하는 데 사용할 수있었습니다 (이 경우 배송 전에 승인이 여전히 유효한지 확인했을 때 알 수 있음). 이 거래는 고객이 이미 승인 한 것보다 더 큰 금액을 모으는 데 사용할 수 없으며 누군가 "상점"이 구성된 것과 다른 계정으로 수금하는 것을 허용하지 않습니다.

찾고 있던 정확한 답이 아닐 수도 있지만 보안 공급 업체에 많은 비용을 들이지 않고도 전반적인 문제를 해결할 수 있습니다.


어떤 상황에서는 암호화 키가 디스크가 아니라 일부 하드웨어 장치에 저장됩니다. 암호화 / 복호화를 수행하기 위해 특수 암호화 서버를 사용하거나 하드웨어 동글에 저장된 키를 사용하여 복호화를 수행합니다. 이렇게하면 해커가 키를 포함하는 물리적 장치를 훔치지 않고는 암호 해독 키를 훔칠 수 없습니다 (키가 장치를 떠나지 않기 때문에).

내가 본 또 다른 방법은 외부 세계와 직접 연결되지 않은 데이터베이스 / 데이터 센터에 암호화 된 데이터를 저장하는 것입니다 (액세스 할 수없는 것은 해킹 할 수 없습니다). 인터페이스 서버는 네트워크의 "보안"부분과 네트워크의 "인터넷 연결"/ "안전하지 않은"부분 사이에 프록시 역할을합니다. 보안 트래픽이이 보안 초크 포인트를 통과하도록 강제하면 침입자가 보안 데이터에 액세스하기가 더 어려워 질 수 있습니다.

물론 이들 모두 데이터가 완벽하게 안전하다는 의미는 아닙니다.


판매자는 CC 데이터를 자신의 데이터베이스에 저장하거나 타사 제공 업체에 아웃소싱하도록 선택할 수 있습니다. IPPayments
와 같은 타사 공급자 또는 Westpac 과 같은 주요 은행호주에서는 레벨 1 PCI를 준수합니다. 웹 응용 프로그램의 경우 회 사용으로 브랜드화 된 지불 승인 웹 페이지 (고객의 워크 플로 어딘가에 표시됨)를 사용하도록 선택할 수 있습니다. Windows 앱 (예 : 회사의 CRM 앱) 및 반복 결제의 경우 일반적으로 토큰 화 서비스를 제공하는 API를 사용하여 사용할 수있는 게이트웨이가 있습니다. 즉, CC 번호를 수락하고 등록한 다음 CC 번호처럼 보이는 고유 토큰을 반환합니다. . 토큰은 DB에 안전하게 저장되어 은행과의 추가 거래, 일괄 지불, 조정 등에 사용할 수 있습니다. 물론 큰 문제는 거래 당 운영 비용입니다. 백만 명의 고객으로부터 월별 신용 카드 결제를받는 유틸리티의 경우 거래 비용이 상당 할 수 있습니다.

CC 번호를 자신의 DB에 저장하도록 선택하면 트리플 DES 암호화로 충분합니다. 더 나은 옵션은 DBA도 CC 번호를 해독 할 수없는 Oracle 고급 보안 또는 SQLServer에서 제공하는 DB의 투명한 암호화입니다. 그런 다음 키 관리, 백업, 물리적 보안, 네트워크 보안, SSL 전송, 모든 서버 장비 및 방화벽의 기본 설정 변경, 바이러스 백신, 감사, 보안 카메라 등에 대한 부담스러운 책임이 있습니다.


우선 신용 카드 번호를 다루는 경우 PCI-DSS를 준수 해야하며 번호를 저장하면 PCI-DSS 사양의 12 개 섹션이 모두 적용됩니다. 이는 대부분의 조직에 큰 비용이며 시간, 자원 및 재정적 수단이없는 경우 신용 카드 번호를 저장하는 경로를 따라 가면 안됩니다.

신용 카드를 저장하는 Windows 기반 전자 상거래 시스템에서 PCI-DSS 규정을 준수했습니다. 256 비트 AES 암호화를 사용합니다. 키 자체는 Windows DPAPI를 사용하여 암호화됩니다. 즉, 암호화 한 것과 동일한 사용자 계정에서 실행되는 프로세스에 의해서만 암호 해독 될 수 있습니다. 암호화 된 키는 레지스트리에 저장됩니다.

The key is rotated every 12 months, and a backup key copy is stored broken into 3 parts A,B,C and spread over 3 USB drives, each held by a different person. Drive 1 has A+B, Drive 2 has B+C, Drive 3 has A+C. So any 2 drives are required to construct a full key (A+B+C). This scheme is tolerant to the loss of any 1 of the drives. Key parts themselves are encrypted with a password known only to the drive owner.


Your assumption that the merchant must store the card somehow is incorrect. Most likely, the merchant is storing a token that it received from the payment processing gateway the first time you used the card. The token uniquely identifies the combination of merchant and card. Subsequently, you can make purchases from that merchant without supplying your card number again. If the merchant's database is compromised, the tokens are of little value to the attacker. They're only valid for that merchant, and they can all be canceled at once when the breach is detected.


To answer your specific question, it is possible to store the credit card encryption key encrypted on disk. The key encrypting key can derived from a passphrase that must be entered when the server is started. Shamir's secret splitting scheme can be used so that k out of N shares are required to construct the secret that will be used as key encrypting key. The decrypted encryption key/secret is then stored in memory. If the server has to be restarted, then you need k shares. This is of course a big overhead and most merchants I know do not implement this. They do however usually store the key separately from the encrypted data for some intermediate security, so access to one does not automatically mean access to the other in entirety (still very bad though).

I deleted contents of my original post since that did not directly answer the question. Suffice it to say that key management and correct encryption are an important piece but still a small part of the story.

PCI auditors cannot possibly ensure that everything is done correctly.


If you want to eliminate any credit card stealing headaches, hash them using salt values not stored in the database (in addition to salt values stored in the database). Hashing them with any modern hashing algorithm will pretty much put to rest most issues with credit card theft but it does mean consumers must re-enter their credit card on each purchase. Having worked on a project that dealt with storage of credit card numbers, I found that hashing them cut security review costs by an order of magnitude (granted that project was before PII concerns).

If you are going to use symmetrical encryption, then you enter a new realm of complication that all comes down to management and control over the decryption keys. I will say that even if you hash the credit card numbers you will still need to deal with reversible encryption since all PII(Personally Identifiable Information) must be encrypted. SQL Server 2008 has a new Extensible Key Mangement plugin architecture which lets use third-party vendor programs to manage control over the decryption keys including split keys.

For more info: Deploying SQL Server 2008 Based on Payment Card Industry Data Security Standards (PCI DSS) Version 1.2.


any automated system for decrypting encrypted information is going to be completly insecure. By automating the process you are defeating the encryption. Any encrypted data should only be decrypted by a user entered secret key.

ReferenceURL : https://stackoverflow.com/questions/2459026/somebody-is-storing-credit-card-data-how-are-they-doing-it

반응형