是否应通过脚本和数据库方式对敏感数据进行加密


Should sensitive data be encrypted through both script and database means?

我对加密不太了解,但是加密已经加密的密码有什么好处吗?我知道盐,但在这样做之前,这重要还是不重要?

当哈希是 1 路时,加密是 2 路的事情。您可以解密加密的刺痛,但不能还原哈希。

一个简单但很好的例子是使用 md5 哈希 + 盐:MD5('password' + 'random_string') - 无论您使用 PHP 还是 MySQL - 结果都是一样的。所以你在这里拥有的是"passwordrandom_string"的哈希值,使用字典不太可能匹配。

因此,每次检查密码时,您都会执行以下操作:

if (md5($password . 'random_string') == $hash_from_db)

更新:但是如果你真的关心安全性(这通常只需要在你的应用程序处理非常敏感的数据时才需要这样做),并说更多 - 你对此有疯狂的偏执和疯狂:互联网上有很多散列方法。用随机盐找到一些东西(所以每个密码都可以有几乎无限量的哈希),做一些更改,将其与其他哈希算法结合起来 - 问题解决了。

您应该知道的一件事 - 有时哈希效果越慢越好。这意味着,如果您在登录尝试计数器中以某种方式存在老鼠洞,这将真正减慢蛮力过程。

你可以看看一个例子 - bcrypt(它使用Java进行哈希处理)。不是说你应该使用它,只是你应该寻找的一个例子。

这个问题对这个话题有一些相关的讨论。在某些情况下,这将是一个坏主意,并且可能会削弱链接线程中指出的加密,因此除非您真的确定要进入的内容,否则您不想这样做。

加密的基本基础是加密(多项式时间)

比解密(非多项式时间)更容易。加密中断的唯一方法是如果满足以下任一/两个条件:

  1. 加密方案中存在一个漏洞,该漏洞减少了加密所需的多项式时间与预期攻击者解密的非多项式时间之间的差距。
  2. 有人有足够的计算资源来解密您的数据(在非多项式时间内)。

听起来在某些情况下,双重加密实际上可能会使问题#1更有可能,所以这很危险。但是问题#2对我来说似乎是更大的问题。这个想法是,拥有足够计算资源的攻击者将能够解密我的数据 - 这意味着他们愿意/能够投入比我加密数据更多的计算资源来解密我的数据。

如果我们接受攻击者拥有解密我的数据所需的大量计算资源,那么在我看来,他们可以拥有 2 倍的资源的想法似乎一点也不合理。

还要意识到,如果你使用相同的密钥,那么实际上没有任何额外的安全性 - 一旦他们破解了一个,他们就已经破解了他们两个。使用两种不同的加密技术使用两个不同的密钥来加密某些内容以防止任一加密方案弹出问题 #1 可能是有价值的,但这肯定是值得商榷的。

这取决于您所说的加密是什么意思。如果您实际上使用例如Microsoft的SQL Server加密引擎加密数据库上的信息,那么是的,这确实很重要。您不应该依赖数据库级加密,因为它并不真正安全。密钥仍存储在计算机上,只能防止不查找该密钥和数据库的天真攻击者。

通常,数据库还支持在数据库加密时以明文形式导出数据。这意味着如果攻击者进入系统,他们可以这样做。如果他们只有硬盘驱动器(外部驱动器被盗),那么它可以节省您。

密码通常应在应用程序中进行哈希处理,然后发送到数据库。生成 64 字节的盐,然后在 || 表示二进制串联的情况下使用 SHA-512(salt || password) 被认为是安全的。不要使用随机ASCII文本作为盐,并坚持使用安全的随机数生成器,例如/dev/urandom或Microsoft的CryptGenRandom。这使得攻击者无法存储预先计算的哈希列表,以便反向查找常用密码。

如果要防止备份驱动器被盗的情况,还需要确保备份数据库、保持加密并将密钥存储在远离加密数据库的安全环境中。我们称之为"将锁与钥匙分开"。由于这在导出数据库的情况下没有帮助,因此您还需要执行我前面提到的哈希。除了加密之外,哈希还将使 1.)攻击者无法获取其他不太敏感的信息,例如姓名和地址以及 2.)攻击者甚至无法开始尝试恢复密码或其他凭据。

最重要的是,这取决于您的威胁模型。

使用不同的密钥加密两次确实可以得到一些好处。例如,使用较弱的 ciper 加密的文件,然后使用较强的密码和密钥强度再次加密,将比仅使用弱密码更难破解。打个比方,把一个脆弱的锁箱放在银行的金库里。但是,一般来说,使用强密码加密比使用弱密码加密两次更好。

在某些情况下,某些

内容适合加密两次,例如当您跨越多个信任障碍时。例如,您可以在将文件发送给云提供商(您可能不信任)之前对其进行加密。如果云提供商需要将文件发送到另一家异地备份公司(云提供的备份公司可能不信任该公司),他们可能会再次加密。

也就是说,对于密码,最好使用强哈希(例如sha1)和盐来存储密码。

是的。这确实很重要。以明文形式将敏感数据存储在任何地方超出了不良做法。这很危险。即使是标准的 md5 哈希现在也被认为是"损坏的",不应该在没有加盐的情况下单独使用,也许还会使用其他哈希组合。只是为了改变现状。

$salt = 'Yh%Gg^!&ud$*';
$encryption = md5(sha1($salt.md5(md5($salt.$_POST['pwd']))));
$query = mysql_query("SELECT * FROM users WHERE name=$uname AND pass=$encryption");

不是最安全的,但如果有人掌握了表格信息,他们将无法在不了解盐和哈希组合的情况下破解它。

最终,您需要根据数据的敏感性做出明智的决定。如果您存储任何类型的用户密码,即使您也不应该知道它们是什么。