2

我对加密知之甚少,但是加密已经加密的东西有什么好处,比如说密码?我知道盐,但在此之前,它是否重要?

4

5 回答 5

1

当散列是单向时,加密是双向的。您可以解密加密的字符串,但不能恢复散列。

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

因此,每次检查密码时,您都会:

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

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

你应该知道的一件事——有时散列越慢——效果越好。这意味着如果您以某种方式在登录尝试计数器中有一个老鼠洞,这将真正减慢暴力破解过程。

您可以查看一个示例 - bcrypt(它使用 Java 进行散列)。不是说你应该使用它,只是你应该寻找的一个例子。

于 2012-04-21T03:20:23.307 回答
0

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

加密的基本基础是加密(多项式时间)比解密(非多项式时间)更容易。加密中断的唯一方法是如果以下任何一个/两个都为真:

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

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

如果我们承认攻击者拥有解密我的数据所需的大量计算资源,那么在我看来,他们可能拥有两倍于这么多资源的想法似乎一点也不合理。

还要意识到,如果您使用相同的密钥,那么实际上并没有增加任何安全性——一旦他们破解了一个,他们就破解了它们。使用两种不同的加密技术和两个不同的密钥来加密某些东西,以防止任何一种加密方案出现问题#1,这可能是有价值的,但这肯定是有争议的。

于 2012-04-21T03:23:34.763 回答
0

使用不同的密钥进行两次加密确实会带来一些好处。例如,使用较弱的密码加密的文件,随后使用更强的密码和密钥强度再次加密,将比仅使用较弱的密码更难破解。类比是在银行的金库内放置一个脆弱的锁箱。但是,一般来说,您最好使用强密码进行加密,而不是使用弱密码进行两次加密。

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

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

于 2012-04-21T03:30:24.470 回答
0

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

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

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

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

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

于 2012-04-21T03:58:18.903 回答
-1

是的。这很重要。以明文形式将敏感数据存储在任何地方都超出了不好的做法。这很危险。即使是标准的 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");

不完全是最安全的,但如果有人得到了表信息,他们将无法在不知道盐和散列组合的情况下破解它。

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

于 2012-04-21T03:18:35.013 回答