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

时间:2012-04-21 02:55:51

标签: php mysql encryption

我对加密知之甚少,但加密已经加密的密码是否有任何好处?我知道盐,但在此之前,它是否重要?

5 个答案:

答案 0 :(得分:1)

当散列为单向时,加密是双向的。你可以解密加密的sting,而你却无法恢复哈希。

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

所以每次检查密码时都会这样做:

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

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

你应该知道的一件事 - 有时较慢的哈希工作 - 越好。这意味着如果你在登录尝试计数器中出现问题,那么真的会减慢暴力攻击过程。

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

答案 1 :(得分:0)

This question就该主题进行了一些相关讨论。在某些情况下,这可能是一个坏主意,可能会削弱链接线程中指出的加密,所以除非你真的确定你要进入什么,否则你不会想要这样做。

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

  1. 您的加密方案存在一个漏洞,它会缩短您加密的多项式时间与您希望攻击者解密的非多项式时间之间的差距。
  2. 有人有足够的计算资源来解密您的数据(在非多项式时间内)。
  3. 听起来有些情况下,双重加密实际上可能会使问题#1更可能发生,因此这很危险。但问题#2对我来说似乎更大。我们的想法是,具有足够计算资源的攻击者将能够解密我的数据 - 这一行为意味着他们愿意/能够投入数量级更多的计算资源来解密我的数据,而不是加密它。

    如果我们接受命令攻击者拥有解密我的数据所需的大量计算资源,那么他们认为他们可能拥有2倍于许多资源,这对我来说似乎并不合理。

    并且还要意识到如果你使用相同的密钥,那么实际上没有任何额外的安全性 - 一旦他们破解了一个密钥,他们就会破解它们。使用两种不同的加密技术和两种不同的密钥来加密某些东西可能是有价值的,以防止问题突然出现在任何一种加密方案中,但这肯定是值得商榷的。

答案 2 :(得分:0)

使用不同的密钥加密两次确实可以获得一些好处。例如,用较弱的ciper加密并随后用更强的密码和密钥强度再次加密的文件将比单独使用弱密码更难破解。这个比喻是将一个脆弱的锁箱放在银行的金库内。但是,一般来说,使用强密码加密比使用弱密码加密两次更好。

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

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

答案 3 :(得分:0)

这取决于加密的含义。如果您实际上使用Microsoft的SQL Server加密引擎加密数据库上的信息,那么它确实很重要。您不应该依赖数据库级加密,因为它不是很安全。密钥仍然存储在计算机上,只能防止那些没有在数据库中找到该密钥的天真攻击者。

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

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

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

底线是它取决于您的威胁模型。

答案 4 :(得分:-1)

是。这非常重要。将敏感数据存储在明文的任何地方都超出了不良做法。这很危险。甚至标准的md5哈希被认为是#34;破坏"现在,不应该单独使用它,也不应该使用其他的散列组合。只是为了解决问题。

$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");

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

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