给定卡号,我会记录用户名和时间戳并生成一个随机字符串(也称为盐)。然后,我将使用一些定义的值对提交的卡号进行编码。这样至少有权访问数据库的人不会直接看到卡号,并且他们至少是一些保护措施。如果数据库被黑客入侵,描述方案可能不会那么健忘。就像您对用户密码进行散列和加盐一样。除了信用卡号和一些定义的变量之外,您在这里也做了同样的事情。
对于数据库加密:
我假设可以使用静态(非常长的随机)字符串和其他定义值的组合来加密卡号。为了解码现在的 CIPHERTEXT,需要稍后调用这些值。
以下是我将如何执行此操作:
首先,在应用层,TO ENCRIPT:
我会得到卡号。
$cardNumberSubmitted = "0123 4567 8910 1234";
然后,我将制定一个对该特定记录完全唯一的密码。例如,我们知道一次购买可以通过一些独特的值来识别:它被放置的确切时间、确切提交的人,或者这两个项目的组合。您也可以定义其他值。只需确保它们对于该记录是唯一的,并且在所有情况下都将被定义。
$密码= $用户名。$日期时间提交;
为了更好地衡量,我还将附加一个在应用程序层中定义的静态字符串。这样,如果有人窃取了您的数据库,他们仍然必须猜测应用程序密码。
$password .= "你的应用程序密码在这里,让它变长";
然后我会生成一个随机字符串并将其附加到密码中。这被称为盐。您可以创建并保存,因为它会随机化条目来封装用户拥有多个条目。
$salt = generateRandomString(10);
$密码 .= $盐;
然后我们生成您的加密值/ CIPHERTEXT:
$cardNumberCipherText = openssl_encrypt($cardNumberSubmitted, $method, $password);
现在,在您的数据库中,您将至少保存以下列:cardNumberCipherText、salt、username 和 dateTimeSubmitted。
在应用层,TO DECRIPT:您将查询 cardNumberCipherText、username、salt 和 dateTimeSubmitted。然后,您将重建密码字符串并解密卡号。
$cardNumberSubmitted = openssl_decrypt($cardNumberEncrypted, $method, $password);
至于应用程序加密, 我将依赖 SSL 并确保我的会话被正确锁定。如果您使用 PHP,则有大量关于如何正确保护 PHP 会话的在线知识。OWSAP 是一个很好的起点。