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