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

Php 敏感数据是否应该通过脚本和数据库方式进行加密?,php,mysql,encryption,Php,Mysql,Encryption,我对加密知道的不多,但是对已经加密的,比如说密码加密有什么好处吗?我知道有盐,但在这之前,这有关系吗?是的。这很重要。将敏感数据以明文形式存储在任何地方都超出了坏习惯。这很危险。即使是标准的md5散列现在也被认为是坏的,不应该单独使用,除非对其进行盐析,或者与它一起使用其他散列组合。只是为了改变现状 $salt = 'Yh%Gg^!&ud$*'; $encryption = md5(sha1($salt.md5(md5($salt.$_POST['pwd'])))); $query =

我对加密知道的不多,但是对已经加密的,比如说密码加密有什么好处吗?我知道有盐,但在这之前,这有关系吗?

是的。这很重要。将敏感数据以明文形式存储在任何地方都超出了坏习惯。这很危险。即使是标准的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");
这并不是最安全的,但是如果有人得到了表信息,他们将无法在不知道salt和hash组合的情况下破解它


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

是。这很重要。将敏感数据以明文形式存储在任何地方都超出了坏习惯。这很危险。即使是标准的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");
这并不是最安全的,但是如果有人得到了表信息,他们将无法在不知道salt和hash组合的情况下破解它


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

加密是双向的,而散列是单向的。您可以解密加密的sting,但不能还原哈希

一个简单但很好的例子是使用md5 hash+salt:md5'password'+'random_string'-无论您使用的是PHP还是MySQL-结果都是一样的。因此,这里的内容是“passwordrandom_string”的散列,使用字典不太可能匹配它

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

if (md5($password . 'random_string') == $hash_from_db)
更新:但是如果你真的担心安全问题,通常只有在你的应用程序处理非常敏感的数据时才需要这样做,更重要的是,你对此有疯狂的偏执和疯狂:互联网上有很多散列方法。找到一些随机盐,使每个密码可以有几乎无限量的散列,做一些更改,结合其他散列算法-问题解决了

有一件事你应该知道——有时候散列越慢越好。这意味着,若你们在登录尝试计数器上有一个老鼠洞,那个么这将真的减慢暴力的进程


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

加密是双向的,而散列是单向的。您可以解密加密的sting,但不能还原哈希

一个简单但很好的例子是使用md5 hash+salt:md5'password'+'random_string'-无论您使用的是PHP还是MySQL-结果都是一样的。因此,这里的内容是“passwordrandom_string”的散列,使用字典不太可能匹配它

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

if (md5($password . 'random_string') == $hash_from_db)
更新:但是如果你真的担心安全问题,通常只有在你的应用程序处理非常敏感的数据时才需要这样做,更重要的是,你对此有疯狂的偏执和疯狂:互联网上有很多散列方法。找到一些随机盐,使每个密码可以有几乎无限量的散列,做一些更改,结合其他散列算法-问题解决了

有一件事你应该知道——有时候散列越慢越好。这意味着,若你们在登录尝试计数器上有一个老鼠洞,那个么这将真的减慢暴力的进程

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

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

加密的基本基础是加密多项式时间比解密非多项式时间更容易。如果以下任一项/两项均为真,则加密将中断:

您的加密方案中存在一个漏洞,该漏洞会缩短加密所需的多项式时间与攻击者解密所需的非多项式时间之间的差距。 有人有足够的计算资源在非多项式时间内解密您的数据。 听起来,在某些情况下,双重加密实际上可能使问题1变得更为可能,因此这是危险的。但第二期对我来说似乎更大。这个想法是一个袭击者和suf 充足的计算资源将能够解密我的数据——这意味着他们愿意/能够投入数量级以上的计算资源来解密我的数据,而不是我加密数据

如果我们在法律上承认攻击者拥有解密我的数据所需的巨大计算资源,那么对我来说,认为他们可能拥有2倍数量的资源似乎一点也不不不合理

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

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

加密的基本基础是加密多项式时间比解密非多项式时间更容易。如果以下任一项/两项均为真,则加密将中断:

您的加密方案中存在一个漏洞,该漏洞会缩短加密所需的多项式时间与攻击者解密所需的非多项式时间之间的差距。 有人有足够的计算资源在非多项式时间内解密您的数据。 听起来,在某些情况下,双重加密实际上可能使问题1变得更为可能,因此这是危险的。但第二期对我来说似乎更大。其想法是,拥有足够计算资源的攻击者将能够解密我的数据——这一行为意味着他们愿意/能够投入数量级以上的计算资源来解密我的数据,而不是我加密数据

如果我们在法律上承认攻击者拥有解密我的数据所需的巨大计算资源,那么对我来说,认为他们可能拥有2倍数量的资源似乎一点也不不不合理


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

使用不同的密钥加密两次确实会带来一些好处。例如,使用较弱的密码加密并随后使用较强的密码和密钥强度再次加密的文件将比仅使用较弱的密码更难破解。类似的做法是在银行的保险库里放一个脆弱的锁箱。但是,一般来说,使用强密码加密比使用弱密码加密两次要好

在某些情况下,某些内容应该加密两次,例如当您跨越多个信任壁垒时。例如,您可能会在将文件发送给您可能不信任的云提供商之前对其进行加密。如果云提供商需要将文件发送给云提供的可能不信任的其他非现场备份公司,他们可能会再次对其进行加密


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

使用不同的密钥加密两次确实会带来一些好处。例如,使用较弱的密码加密并随后使用较强的密码和密钥强度再次加密的文件将比仅使用较弱的密码更难破解。类似的做法是在银行的保险库里放一个脆弱的锁箱。但是,一般来说,使用强密码加密比使用弱密码加密两次要好

在某些情况下,某些内容应该加密两次,例如当您跨越多个信任壁垒时。例如,您可能会在将文件发送给您可能不信任的云提供商之前对其进行加密。如果云提供商需要将文件发送给云提供的可能不信任的其他非现场备份公司,他们可能会再次对其进行加密


也就是说,对于密码,您最好使用强散列,例如sha1和盐一起存储密码。

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

通常,数据库还支持在pla中导出数据 加密数据库时输入intext。这意味着,如果攻击者进入系统,他们可以这样做。如果他们只有硬盘,外置硬盘被偷了,那就省钱了

通常,密码应该在应用程序中散列,然后发送到数据库。生成一个64字节的salt,然后使用SHA-512salt | | |密码,其中| |表示二进制连接,这被认为是安全的。不要将随机ASCII文本用于SALT,请使用安全的随机数生成器,如/dev/uradom或Microsoft的CryptGenRandom。这使得攻击者无法存储预先计算的哈希列表来反向查找常用密码

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


底线是,这取决于你的威胁模型

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

通常,当数据库加密时,数据库还支持以明文形式导出数据。这意味着,如果攻击者进入系统,他们可以这样做。如果他们只有硬盘,外置硬盘被偷了,那就省钱了

通常,密码应该在应用程序中散列,然后发送到数据库。生成一个64字节的salt,然后使用SHA-512salt | | |密码,其中| |表示二进制连接,这被认为是安全的。不要将随机ASCII文本用于SALT,请使用安全的随机数生成器,如/dev/uradom或Microsoft的CryptGenRandom。这使得攻击者无法存储预先计算的哈希列表来反向查找常用密码

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


底线是,这取决于你的威胁模型

盐在加密中通常不会起作用。嗯,他们可能会削弱它一点。你是说散列吗?@minitech Salting与加密无关,几乎完全如此。给密码块一个常量值不应该削弱它,除非它容易受到选择的明文攻击,或者如果salt以特殊方式与密钥特别相关。@MichaelJ.Gray:准确-取决于加密类型:如果你对XOR加密进行salt,它会立即消失。只是覆盖了所有的基础。盐在加密方面通常不会有什么区别。嗯,他们可能会削弱它一点。你是说散列吗?@minitech Salting与加密无关,几乎完全如此。给密码块一个常量值不应该削弱它,除非它容易受到选择的明文攻击,或者如果salt以特殊方式与密钥特别相关。@MichaelJ.Gray:准确-取决于加密类型:如果你对XOR加密进行salt,它会立即消失。我应该注意到破解密码散列本身是一件非常困难的事情:同样,没有办法恢复散列,所以你所能做的就是尝试不同的字符串,看看它们是否匹配。其中一个常用的方法是使用大型字典,尝试每个单词并检查它是否与哈希匹配。你可以很容易地在MD5上找到冲突。如中所示,给定hm=z,可以找到hm'=z。有关于它的信息。这意味着在给定方案的情况下,攻击者可以为级联生成的给定哈希找到同样有效的密码。MD5已完全损坏,不应在任何系统中使用。@MichaelJ.Gray:碰撞攻击与密码哈希方案无关。。。尝试查找散列为相同值的两个密码没有意义,您需要查找一个密码散列

到现有值,该值是前映像攻击。虽然你是对的,但不要在任何事情上使用MD5。@pyrate:使用快速散列函数和典型的密码强度,以及使用GPU等进行并行计算,暴力强制输入密码的速度惊人地快。这就是为什么我们要这么做。@PaŭloEbermann两种攻击都很可怕,即使其中一种对密码没有特别的用处。但是,是的,这很有道理。而且,强制使用MD5哈希确实是闪电般的快;我的GTX 460每秒可以进行数十亿次尝试。我应该注意到破解密码散列本身是一件非常困难的事情:同样,没有办法恢复散列,所以你所能做的就是尝试不同的字符串,看看它们是否匹配。其中一个常用的方法是使用大型字典,尝试每个单词并检查它是否与哈希匹配。你可以很容易地在MD5上找到冲突。如中所示,给定hm=z,可以找到hm'=z。有关于它的信息。这意味着在给定方案的情况下,攻击者可以为级联生成的给定哈希找到同样有效的密码。MD5已完全损坏,不应在任何系统中使用。@MichaelJ.Gray:碰撞攻击与密码哈希方案无关。。。尝试查找散列为相同值的两个密码没有意义,您希望查找散列为现有值的密码,这是一种前映像攻击。虽然你是对的,但不要在任何事情上使用MD5。@pyrate:使用快速散列函数和典型的密码强度,以及使用GPU等进行并行计算,暴力强制输入密码的速度惊人地快。这就是为什么我们要这么做。@PaŭloEbermann两种攻击都很可怕,即使其中一种对密码没有特别的用处。但是,是的,这很有道理。而且,强制使用MD5哈希确实是闪电般的快;我的GTX 460每秒可以完成数十亿次试验。我同意减慢速度有助于暴力攻击。但是,哈希函数的速度变慢的问题是,您总是希望比攻击者做更少的工作。攻击者发送假用户名/登录名很简单,但服务器计算哈希值需要很多周期。这可能会为DDos攻击打开应用程序。您可能需要考虑在多次失败的登录尝试之后锁定IP或用户。不要发明新的哈希方案,使用标准的哈希方案。关于密码散列,请参见。嗯,非常好的观点。非常感谢。以随机字符串作为盐,使用的随机字符串应该存储在哪里?在单独的表、用户表等中。?再次感谢。@Andy这只是一个硬编码的示例,向您展示了这个想法。我建议使用更安全的东西。再一次,我想你会发现bcrypt在那一点上很有趣。我确实看过bcrypt。这是一种很有吸引力的方式。非常感谢。我同意减速有助于暴力攻击。但是,哈希函数的速度变慢的问题是,您总是希望比攻击者做更少的工作。攻击者发送假用户名/登录名很简单,但服务器计算哈希值需要很多周期。这可能会为DDos攻击打开应用程序。您可能需要考虑在多次失败的登录尝试之后锁定IP或用户。不要发明新的哈希方案,使用标准的哈希方案。关于密码散列,请参见。嗯,非常好的观点。非常感谢。以随机字符串作为盐,使用的随机字符串应该存储在哪里?在单独的表、用户表等中。?再次感谢。@Andy这只是一个硬编码的示例,向您展示了这个想法。我建议使用更安全的东西。再一次,我想你会发现bcrypt在那一点上很有趣。我确实看过bcrypt。这是一种很有吸引力的方式。非常感谢。事实上,级联密码是不是一个好主意还没有得到证实。看起来是这样的,但一旦加密,数学上相关的密码会削弱整个方案的安全性。例如,假设您有一个加密过的密码有一个加密函数ax,然后另一个看似不相关的密码有一个加密函数bx。它们各自的解密函数ax和bx可以通过逆合成在数学上关联起来,以否定相反的函数。基本上,ax=b`x。级联时,可能会泄漏循环状态信息或明文。据我所知,使用相同的密钥似乎是个坏主意,尤其是在流密码的情况下。在密码中使用两个不同的密钥只会改变函数,而不会改变关系。使用相同的密钥或不同的密钥,对大多数密码来说危险是相同的。我不完全相信这是真的。你有消息来源吗?在哪一部分?考虑在特定键下操作的分组密码只是将输入映射到特定输出的函数。现在,在一个特定的输入上连续多次计算这个映射,并将函数自身组合几次。你仍然会得到一个伪随机映射。当您派生两个加密函数时,就会出现此漏洞,其中一个是使用algorit的另一个加密函数的反函数
HMB与算法A的解密相同。它是简单的代数,但它是理论上的。用这种方法开发一个真正的密码需要大量的分析和简化。实际上,级联密码是不是一个好主意还没有得到证实。看起来是这样的,但一旦加密,数学上相关的密码会削弱整个方案的安全性。例如,假设您有一个加密过的密码有一个加密函数ax,然后另一个看似不相关的密码有一个加密函数bx。它们各自的解密函数ax和bx可以通过逆合成在数学上关联起来,以否定相反的函数。基本上,ax=b`x。级联时,可能会泄漏循环状态信息或明文。据我所知,使用相同的密钥似乎是个坏主意,尤其是在流密码的情况下。在密码中使用两个不同的密钥只会改变函数,而不会改变关系。使用相同的密钥或不同的密钥,对大多数密码来说危险是相同的。我不完全相信这是真的。你有消息来源吗?在哪一部分?考虑在特定键下操作的分组密码只是将输入映射到特定输出的函数。现在,在一个特定的输入上连续多次计算这个映射,并将函数自身组合几次。你仍然会得到一个伪随机映射。当您导出两个加密函数时,就会出现此漏洞,其中一个是另一个加密函数的函数逆,使用算法B进行加密与使用算法A进行解密相同。这是简单的代数,但它是理论上的。用这种方法开发一个真正的密码需要进行大量的分析和简化。对于SALT来说,它们是二进制还是ASCII码并不重要。。。散列函数接受所有。您只需要比二进制字节多一些ASCII字节就可以获得相同的熵。更重要的是,对于盐来说,它们是二进制的还是ASCII的,这并不是真的相关。。。散列函数接受所有。您只需要比二进制字节多一些ASCII字节就可以获得相同的熵。更重要的是,嗯。时间多项式/非多项式在哪个参数中?加密和解密知道密钥只需要消息大小的线性时间,并且通常两者都需要相同的时间。谢谢您的输入。你的观点有道理。我将查看我的加密选项,并在实施之前进行研究。但我只存储密码,对获取敏感数据没有真正的危险。但我认为这是一个很好的机会来了解这一点,因为我想在我心目中的其他项目上更进一步。再次谢谢你。时间多项式/非多项式在哪个参数中?加密和解密知道密钥只需要消息大小的线性时间,并且通常两者都需要相同的时间。谢谢您的输入。你的观点有道理。我将查看我的加密选项,并在实施之前进行研究。但我只存储密码,对获取敏感数据没有真正的危险。但我认为这是一个很好的机会来了解这一点,因为我想在我心目中的其他项目上更进一步。再次感谢你。