若是本文中的术语让你感到疑惑,请先参阅密码学术语及概念一文。php
密码学不是魔术。加密一个应用程序并不能保证它在袭击下的安全(特别是在你没有设置验证密文的状况下)。但若是出于商业需求你要确保程序的安全,传统作法会建议你最好不要尝试设计你本身的密码。你应该使用已有的密码库。算法
好了,以上我都了解了。那么我应该用哪一个PHP密码库呢?数据库
这取决于你的实际需求。让咱们来看一下一些好的选择。(咱们不会说起任何糟糕的密码库的。)编程
下面是一个安全信任度较高的可部署在生产环境中的PHP密码库清单。本清单基于如下三项标准进行优先排序。安全
若正确使用,此密码库的安全程度如何?服务器
风险行为的困难度如何?cookie
一个非密码破译者最大限度使用之的简易度如何?oracle
咱们推荐此密码库不只是由于它是咱们自写的,首推它是由于你能够经过简单直观的接口获取使用libsodium的所有安全保护。这是一款免费软件,而且源码是能够直接获取的。框架
• 主线ide
对称密钥认证加密
对称密钥认证(例如:API 消息)
非对称密钥认证加密
非对称密钥匿名加密
非对称密钥数字签名
• 全文件加密(见:全部主线特征)
• 加密cookies
• 密码存储
• 你不须要知道现时值是什么,你也不须要特别关注认证加密。Halite会帮你作好一切。
咱们建立Halite以供PHP开发者经过一个更简单的接口获取libsodium拓展的全部安全性优点。查看Halite的相关文件就能知道它的使用是多么简便。(尽管 API 是固定的,Halite帮助文件依然是不完善的。然而它已经足以涵盖入门级的内容。)
惟一的缺陷是你必须安装PHP的libsodium扩展包才能使用Halite。所以对于不少项目来讲,Halite方式是行不通的。
须要 paragoniehalite`
很显然,若是你不喜欢咱们对于Halite所作的决策,那么能够考虑直接使用libsodium。
• 对称密钥加密认证(同:AEAD)
• 对称密钥认证
• 非对称密钥认证加密
• 非对称密钥匿名加密
• 非对称密钥数字签名
• 加密哈希函数
• 密码存储
• 瑞士军刀式的密码学原语(好比:基于Curve25519的Diffe-Hellman密钥交换协议的椭圆曲线)
• 在PHP中的内存清除(补零)能力
• 还有好多
请向Frank Denis以及创做了NaCl(libsodium由此分生)的小组致敬,由于libsodium一直是世界上最可靠的,跨平台的密码学库。
请参阅相关文件。
若是你不能从PECL(也就是永远不能安装libsodium)安装PHP拓展包,这个密码库应该是你的备用选择。一般状况下,不论你的框架提供了什么方案,你都应该优先考虑它,由于咱们的安全小组常常能发现PHP框架提供的对称密钥加密功能的缺陷。
• Symmetric-key authenticated encryption
• 对称密钥认证加密
它解决了大多数人都会遇到的一个问题(而且解决得很是棒)。该密码库的第二版(即将发布!)将一样涵盖全文件加密,可是因为它还未发布,所以咱们还不能以此为加分项。
若是你必定要安装对称密钥加密,请使用上述的Defuse的密码库。Defuse Security的密码库为你提供了认证加密,而phpseclib的AES实施并不会验证密文。所以若是你使用它,你对选择密文攻击的抵抗力将十分脆弱。(他们的交互文件在ECB模式下一样出错严重,是咱们提过的最坏分组密码模式。)
尽管phpseclib为通用对称秘钥加密方式提供的 API 等级太低,使得咱们不肯向缺少密码学背景的PHP开发者在这种使用方式下推荐它,可是它相对extopenssl而言提供了一种更好的非对称秘钥加密方式。
若是你坚持必须使用非对称秘钥加密方式(公共秘钥加密,电子签名)而且出于各类缘由没法使用libsodium,那么你就应该考虑安装phpseclib,而且严格遵循Colin Percival提出的密码算法的正确解答。
signature scheme),再次明确指定使用MGF1+SHA256
若是你恰好是一位密码学专家,那你能够忽略咱们的警示信息,使用phpseclib提供的对称秘钥加密方式。可是对大多数非密码学专家的编程者来讲,请最好不要忽略咱们的提示。
对称秘钥认证(经过HMAC秘钥,PHP一样提供)
非对称秘钥匿名加密(RSA)
非对称秘钥电子签名方式(RSA)
在本篇博客发布之后,咱们又针对建议开发了插入式安装包,EasyRSA。EasyRSA是一种方向肯定且默认安全设置的phpseclib使用。
问题:使用RSA加密一段超大字符串,即便RSA自己也不支持加密超大字符串数据。
原始解决方案是将你输入的字符串切分分块并单独分别加密。然而这和可怕的电码本(ECB)模式十分类似。一样的:它的处理进程也十分缓慢。这是个很是糟糕的解决方案。
生成临时秘钥
使用Defuse Security的PHP对称秘钥加密密码库加密您的消息
使用已有RSA公共秘钥加密临时秘钥(一种对padding oracles攻击方式抵抗效果良好的方式)
基于64位编码,而且使用版本标记前缀来链接密文
附加第四步中的校验和(截取的哈希SHA256加密算法)来加强传输存储错误检测能力。
验证检验和和版本标记
使用正确RSA私钥来解密临时秘钥
使用上一步获取的解密秘钥来获取明文
EasyRSA只使用RSAES-OAEP + MGF1-SHA256 with e = 65537来进行公钥加密,已知此种加密方式对任何padding oracle攻击都是有良好抵抗力的。
RSA签名方式是相对直接的:使用RSASS-PSS + MGF1-SHA256 with e = 65537来计算RSA签名,而后校验它是否设定为仅接受此种签名。
可是认真讲,若是你真的想为你的PHP程序找到一种确保安全的加密方式,请尝试寻找能使用libsodium的方式。咱们正推进使libsodium成为PHP7.1中的核心拓展包,所以但愿它的使用可以在未来同“更新新版PHP”同样简单。
任何未在上文说起的密码库的落选缘由均可以由如下三条可能缘由解释:
咱们审核了该密码库,可是凭心而论并不足以让咱们进行推荐。(有可能咱们已经告知创做者其密码库存在缺陷,以便他们加以改进。)
密码库使用范围太窄(好比Crypt GPG),或者尽管安全,它和加密的普遍使用状况并不相关。
咱们太忙了,还没审核该密码库。(咱们可能还不知道有这个密码库的存在。)
若是你对咱们认定有缺陷的密码库感兴趣,请查看安全建议页以获取更多信息。
你不须要加密密码,你只须要用合适的密码散列算法(哈希密码算法)来杂乱密码。当前的最佳密码库之一是PHP内建的: password_hash() andpassword_verify()。这种散列算法对99%的编程者或企业来讲都是稳定有效的。这个算法就是这么棒。
然而,若是你将数据库中的密码存储在你网页应用的不一样服务器中,你能够经过加密散列(而不是加密密码自己)来减轻密码入侵风险。要使用这种方式,请查看Halite密码课程。
尽管咱们雇佣了一些PHP开发安全的行业顶尖专家(而且咱们精于应用密码学),在不了解你的特定项目要求和风险模型的前提下,他们在写做这篇向导时并不能指引你选取最符合需求的解决方案。
所以若是,好比,你须要使用非对称加密算法,还执意选择使用Defuse Security的对称加密密码库,请不要说“是Paragon Initiative Enterprises让我这么干的!”
若是你想根据本身的特定项目得到咱们的安全建议,请考虑雇用咱们进行安全咨询服务。
或者用法律术语说:此文信息不提供任何担保,使用风险自负。
原文地址:Choosing the Right Cryptography Library for your PHP Project: A Guide
本文系 OneAPM 工程师编译整理。OneAPM 是应用性能管理领域的新兴领军企业,能帮助企业用户和开发者轻松实现:缓慢的程序代码和 SQL 语句的实时抓取。想阅读更多技术文章,请访问 OneAPM 官方博客。
本文转自 OneAPM 官方博客