哪种PHP mcrypt密码最安全?

26
7个回答

46

如果不确定,使用AES(也称为“Rijndael”)和128位密钥。如果您对密钥长度有某种迷恋,那么可以通过选择更大的密钥来满足您的非理性顾虑,例如192或256位。额外的成本不高(与AES-128相比,AES-256的工作量增加了约40%,并且需要非常快速的网络才能真正观察到这种差异)。

请注意,无论选择哪个密钥大小,AES的正确mcrypt密码始终是MCRYPT_RIJNDAEL_128。这是因为AES标准是指具有128位块大小的Rijndael密码的变体。如果要使用AES-256,则需要使用带有256位(32字节)密钥的MCRYPT_RIJNDAEL_128,而不是MCRYPT_RIJNDAEL_256

AES于1998年发布,并于2001年被美国政府采用为联邦标准,至今没有显示出任何弱点。后来发现了一些数学特性,但它们并不影响实际安全性;主要是强调我们对AES安全性的相对精确的了解。没有其他对称加密算法比AES获得过如此多(由数千名才华横溢的密码学家)的关注。

大多数安全问题来自加密算法的使用方式,而不是算法本身。使用适当的链接模式,添加MAC,管理填充,最重要的是安全处理密钥。如果您做到了这一点(比看起来更为棘手),那么就可以开始担心选择Rijndael,Twofish或其他加密算法了。


1
“proper chaining mode and add a mac”是什么意思?你是在谈论密码块链模式变体CMAC吗?因为可能只有两个人知道这是什么。此外,你没有提到IV的使用。 - rook
7
完整介绍如何使用分组密码需要耗费我的耐心,而且很多读者也同样无法忍受。我信息的主旨是:1.回答所提出的明确问题,2.让请求者感到问题很复杂,不应轻率处理。在我看来,使用随机IV编码的CBC模式和HMAC已经“足够适当”。CMAC仅为MAC;如需结合加密和MAC的高级模式,请参考GCM(Galois/Counter Mode)。 - Thomas Pornin
1
PHP的mcrypt有GCM示例吗? - Scott Arciszewski
1
192位和256位密钥大小是为了符合美国军方的不可变规定而存在的,这些规定要求加密系统具有三个不同的“安全级别”(当这些规定在1930年代编写时,这是有意义的,因为在计算机出现之前,我们不知道如何同时制作既非常高效又非常安全的加密系统)。 - Thomas Pornin
1
@ScottArciszewski:请便。 - Thomas Pornin
显示剩余2条评论

5
除了Thomas Pornin的好答案外,您还必须考虑在“安全性”(保密性/完整性/真实性/可用性)方面要实现什么。
对于每种情况,您都需要回答一些问题,例如...这适用于谁?在哪里以及为什么使用它(您要保护什么)?它意味着要持续多长时间?等等。
例如,在会话数据实际上只需要持续20-30分钟时,使用一个256位操作序列来加密会话数据没有任何意义。一个安全的128位算法将快近一倍,或者至少使用更少的时钟周期,并且同样(如果不是更加)安全。
另外,没有必要使用弱的、简短的密钥方法来加密那些需要长时间保存的东西(比如机密文档或文件、私钥等)。有时您需要使用多个算法,带有某种认证和适当的填充方法。我经常根据客户的要求使用多种算法(主要是twofish、AES、RSA)来加密和签名内容。
还有一点不能忘记(就像Thomas指出的那样),即使采用安全的方法(或方法),也可能不安全地实施。由于每个公式的大量变体等原因,实际上很难实现“安全”的东西。
通常情况下,某物的安全程度取决于解锁它的钥匙的安全性。如果我把汽车钥匙留在未锁定的汽车里,那么这些钥匙就不安全了,任何经过的人都可以拿走它们。 Blowfish使用分散良好的32个字符密钥将与今天的任何其他东西一样安全。然而,一个3个字符的密钥可能会在一眨眼之间被破解。

3

最强的加密算法是AES-256。

从Bruce Schneier网站上的详细信息来看,出乎意料的是,在128位、192位和256位三种密钥长度中,AES-256可能是最不安全的。这是因为256位变体中存在密钥生成问题。


2
通常情况下,对于普通加密使用来说,AES-256 没有特定的漏洞。相关密钥攻击主要在 AES 用于构建安全哈希函数等场合下才具有重要意义。 - Maarten Bodewes

2

一些算法在不同的方面表现更优秀 - 不确定您对“最安全”的标准是什么。

现在您肯定不应该使用基于DES的任何算法(假设您有自由选择)。AES(Rijndael)是NIST和其他机构的当前标准。

通常,特定算法的更多位数意味着更加安全,但请确保使用初始化向量并且不要使用ECB。

希望能帮到您。

C.


嗨,初始化向量 - 你能告诉我更多关于它的信息吗? - Industrial
RTFM?在互联网上和其他文档中有比我在这里提供的更好的文档。 - symcbean
1
+1 ECB模式是为傻瓜准备的。虽然IV很容易使用,但请确保没有两条消息使用相同的IV和相同的密钥进行加密,因此您可以使用要加密的表的主键作为密钥。 - rook

2
根据NIST的论文,相比于MARS、twofish或serpent,RJINDAEL的安全边际较低。如果你真的需要最强的密码,选择其中之一吧。

http://csrc.nist.gov/archive/aes/round2/r2report.pdf

引用: “MARS似乎具有很高的安全保障系数。由于MARS采用了两种不同类型的轮,因此精确描述MARS是困难的。MARS基于其复杂性受到了一些批评,这可能在AES开发过程中阻碍了其安全分析。”
“Rijndael似乎具有足够的安全保障系数。安全保障系数有点难以衡量,因为轮数随密钥大小而变化。 Rijndael在两个方面受到批评:其安全保障系数在决赛选手中处于较低水平,并且其数学结构可能导致攻击。但是,它的结构相当简单,这可能在AES开发过程中促进了其安全分析。”
“Serpent似乎具有很高的安全保障系数。 Serpent也具有简单的结构,这可能在AES开发过程中促进了其安全分析。”
Twofish似乎具有很高的安全保障。由于Twofish使用密钥相关的轮函数,相对于其他候选算法,安全保障的概念可能对该算法意义不大。在k位密钥情况下,Twofish S盒仅依赖于k/2位熵,这引发了一种推测,即Twofish可能容易受到分治攻击,尽管目前未发现此类攻击。Twofish因其复杂性而受到批评,在AES开发过程中难以进行分析。

1

如果您想查看详细信息,可以参考我在http://en.citizendium.org/wiki/Block_cipher上撰写的有关分组密码的文章。

为了符合当前的美国标准,请使用AES(前身为Rijndael)。其他AES竞赛的入围者--Serpent、MARS、Twofish或RC-6--也应该可以。不过,我认为您需要获得RC6的许可证。


0

我通常使用AES-128,因为AES是FIPS认证的。最强的密码是AES-256(MCRYPT_RIJNDAEL_256)。

mcrypt具有模块化设计,可以轻松添加新的密码。


2
MCRYPT_RIJNDAEL_256 不是 AES。它是 Rijndael 算法的一种变体,但块大小为 256(因此得名),而 AES 是 Rijndael 的一种变体,块大小为 128。如果您想要 AES,则使用 MCRYPT_RIJNDAEL_128,并提供 128、192 或 256 位密钥。 - hunter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接