我正在构建一个接受付款的移动应用程序。用户输入他们的 CC 详细信息,付款信息通过 HTTPS 提交到零售商的 POS 系统。POS 直接处理付款并需要实际的信用卡信息才能工作,因此我们不能使用像 Stripe 这样的服务来存储卡,并给我们一个令牌来处理付款。
由于应用程序的性质,用户将定期付款,因此我想存储他们的 CC 信息以方便使用。但是,这不是定期计费,用户将随意发起交易。因此,我不需要将 CC 集中保存在服务器上,我正在考虑使用这种方法在每个用户的设备上存储单独的卡:
- 收集 CC 编号和到期日期
- 使用 AES256 加密,使用 CVC 作为密钥(CVC 未存储)
- 然后将加密的数据存储在 iOS 钥匙串中(或等效于 Android)
- 为了进行支付,(a) 从钥匙串中取出数据,并且
- (b) 用户必须输入 CVC 才能解密 CC 信息
这个想法是,如果用户知道 CVC,他们可能无论如何都拥有该卡,因此他们不需要尝试破解设备。
对于加密,我正在考虑使用RNCryptor lib。它的主要功能之一是将常用密码自动转换为两个 256 位密钥的加密“随机”字节序列,用于加密和身份验证。密钥拉伸是通过 10k 轮 PBKDF2 实现的。实现细节在链接中,但简而言之:
- AES-256 加密
- CBC模式
- 使用 PBKDF2 进行密码拉伸
- 密码加盐
- 随机四
- 加密然后散列 HMAC
问题:
我对数学的理解还不够好,无法判断仅用 3 个 CVC 数字播种 RNCryptor 的密钥拉伸实现是否会产生统计上足够随机的密钥。我无法找到任何有关 RNCryptor 保持安全所需的密码规范的文档。对此的任何想法将不胜感激。使用这个库就像这样简单:
// 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
}
// ...
在 iOS 钥匙串(或 droid 等效项)上讲述AES256 加密的CC 信息时,是否启用设备锁定密码是否重要?我的想法是,信息已经是 AES256 加密的,它可以存储在设备上而无需钥匙串的加密吗?
鉴于没有存储大量 CC 编号的中央服务器,在这种情况下,PCI 合规性的哪些部分是相关的?我尝试阅读 PCI 规范,但文档是一个迷宫:(