我一直在阅读很多关于 GCM 的内容以及它有多棒,我想知道如何使用 PHP使用 AES-GCM 身份验证加密即可。是否mcrypt()
支持?我在Codeigniter框架文档中找到了对 GCM 的一些引用,这使我相信可以在Codeigniter中使用。
我还在一篇关于 Zend 的文档中发现了一些内容。我不打算使用 Codeigniter 驱动程序,因为我没有使用任何框架而且不打算用于我当前的项目。在我看来,如果 Codeigniter 能够做到这一点,那么我们应该能够没有框架。
似乎 GCM 是获得安全性和性能的方式(我看到非常令人印象深刻的性能数字)。我的感觉是我们需要这个,但我找不到任何例子。有人必须知道如何实现这一目标。我知道它受 OpenSSL 支持。
非常感谢任何帮助。
答案 0 :(得分:5)
你在这里提出几个问题,所以我将按照上述说明单独解决这些问题:
mcrypt()支持吗?
不,mcrypt本身不支持AES加密。但它确实支持Rijndael(发音类似'rain-doll'),这是AES的基本算法。 AES被定义为Rijndael的一组特定参数,因此您可以使用适当的参数来匹配AES,但GCM模式不可用。
似乎GCM也是安全的方式 表现(我看到了令人印象深刻的表现数字)。我的感觉是 我们需要这个,但我找不到任何例子。
不幸的是,这是选择安全模型或实现的错误方法。不同的算法和密码模式具有不同的用途,并且应用错误的模式,例如,即使您使用的是明显强大的密码(如AES),也可能使您的应用程序容易受到攻击。 GCM非常好用,因为这种模式一次性提供加密和身份验证。并非所有应用程序都需要这两种应用程序,或者可能以削弱其设计强度的方式使用它们。您需要做好功课,以确保这是您的应用程序使用的正确模式,以及当前使用的最小参数。
除非您是安全专家,否则使用经过验证的框架会更好。实施自己的加密或安全管理绝不是一个好主意,因为很容易犯错误,让您对简单的攻击敞开大门。最好的选择是找到一个开源的,经过验证和测试的框架,它可以完成您想要完成的任务,并根据您的需求进行仔细配置。在那之后,保持框架修补和更新是关键。
由于您提到了AES-GCM的性能统计数据,是的,它在现代CPU(i7和更新版本)上表现非常出色,它们具有专门用于加速所需操作的硬件支持。如果您的服务器或客户端没有硬件加速, AES-GCM会慢得多。除了实际的硬件支持之外,您使用的软件库也很关键,因为它需要调用所需的硬件才能利用提高的速度。
我知道OpenSSL支持它。
OpenSSL是实现AES-GCM的此类库之一,如果可用AES-NI(硬件加速技术),它确实会占用优势。
坏消息是,今天(2015年2月初)提供的PHP扩展不支持实现AES-GCM的特定库。急于使用GCM源于SSL协议中最近发现的漏洞,这些漏洞最终迫使每个人都迁移到TLS并进入带身份验证的加密模式。尽管安全专家多年来一直在推动此类举措,但服务器和浏览器制造商都在拖着脚步等待彼此迈出认证加密的第一步。我们终于开始看到正确方向的运动。
我相信今年晚些时候我们最终会在PHP中使用AES-GCM,但目前它还没有免费提供。
一些信息来源: http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption其中显示了EVP库。 AES-GCM的高级实现,利用AES-NI
http://phpaes.com PHP的AES实现。我不知道他们是否经过了适当的测试,或者是否使用了硬件加速。他们不提供GCM,但它可能是一个很好的学习工具。
答案 1 :(得分:2)
您可以将模式设置为初始化功能的参数:
$this->encryption->initialize(
array('mode' => 'gcm')
);
使用此代码,您当然使用ci及其加密类
$this->load->library('encryption');
你也可以在initialize方法中更改密码,驱动程序和密钥 - 有关更多信息,请查看http://www.storycon.us/ci3/libraries/encryption.html#id11
答案 2 :(得分:1)
OpenSSL无法正常工作,因为PHP 7.1之前的所有版本都不支持AEAD。
您可以使用此库:https://github.com/Spomky-Labs/php-aes-gcm
这是一个纯PHP库。加密/解密可能比PHP扩展慢,但它可以完成这项工作。 该库也使用来自NIST的测试向量进行测试。