1

抱歉,如果这个问题有点宽泛,但我想了解如何保护与 Web 应用程序结合使用的数据库中的敏感信息。

假设一家在线零售商存储消费者信用卡信息。PCI DSS 规定主号码必须以加密格式存储。虽然我的问题是你如何防止未经授权的解密?我看到两种情况,每种情况都有风险

数据库加密 如果开发人员对卡号列进行加密,则未经授权的数据库用户无法解密信息。然而,信息随后被加密到 Web 应用程序帐户(或某些应用程序帐户)。因此,如果此帐户被盗用,那么基本上任何记录都可以被解密。这是针对 SQL 注入的主要保护措施吗?

应用程序加密 开发人员可以在存储在应用程序级别之前对信息进行加密。通过隔离数据,您可能会获得更高的安全性。此外,根据您构建应用程序的方式,您可能会个性化加密,以便他们的登录凭据成为解密的密钥。然而,这具有复杂性,例如更改密码、复杂性要求等。

是否存在行业中常见的“典型”实现?我知道当我访问 Amazon.com 时,我需要在购买前租用我的密码。他们是使用单个密钥为网络帐户加密数据,还是对单个用户的信息进行加密。

4

1 回答 1

0

给定卡号,我会记录用户名和时间戳并生成一个随机字符串(也称为盐)。然后,我将使用一些定义的值对提交的卡号进行编码。这样至少有权访问数据库的人不会直接看到卡号,并且他们至少是一些保护措施。如果数据库被黑客入侵,描述方案可能不会那么健忘。就像您对用户密码进行散列和加盐一样。除了信用卡号和一些定义的变量之外,您在这里也做了同样的事情。

对于数据库加密: 我假设可以使用静态(非常长的随机)字符串和其他定义值的组合来加密卡号。为了解码现在的 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 是一个很好的起点。

于 2015-08-12T21:12:15.003 回答