数据库/应用程序加密在Web应用程序中的作用

时间:2013-10-16 17:28:07

标签: security web-applications encryption

很抱歉,如果这个问题有点广泛,但我正在努力了解如何保护与Web应用程序配合使用的数据库中的敏感信息。

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

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

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

是否存在业内常见的“典型”实施方案?我知道当我去Amazon.com时,我需要在购买之前租用我的密码。因此,他们使用Web密钥的单个密钥加密数据,或者加密个人用户的信息。

1 个答案:

答案 0 :(得分:0)

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

对于数据库加密: 我会假设卡号可以使用静态(非常长的随机)字符串以及其他定义值的组合来编写。稍后需要调用这些值以便解码现在的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是一个很好的起点。