为你的PHP程序选择合适的密码库(初稿)

如果本文中的术语让你感到疑惑,请先参阅密码学术语及概念一文。

密码学不是魔术。加密一个应用程序并不能保证它在袭击下的安全(特别是在你没有设置验证密文的情况下)。但如果出于商业需求你要确保程序的安全,传统做法会建议你最好不要尝试设计你自己的密码。你应该使用已有的密码库。

好了,以上我都了解了。那么我应该用哪个PHP密码库呢?

这取决于你的实际需求。让我们来看一下一些好的选择。(我们不会提及任何糟糕的密码库的。)

安全的PHP密码库建议

下面是一个安全信任度较高的可部署在生产环境中的PHP密码库清单。本清单基于以下三项标准进行优先排序。

  1. 若正确使用,此密码库的安全程度如何?
  2. 风险行为的困难度如何?
  3. 一个非密码破译者最大限度使用之的简易度如何?

Halite – 来自 Paragon Initiative Enterprises

我们推荐此密码库不仅是因为它是我们自写的,首推它是因为你可以通过简单直观的接口获取使用libsodium的全部安全保护。这是一款免费软件,并且源码是可以直接获取的。

使用Halite的好处

• 主线

  • 对称密钥认证加密
  • 对称密钥认证(例如:API 消息)
  • 非对称密钥认证加密
  • 非对称密钥匿名加密
  • 非对称密钥数字签名

• 全文件加密(见:所有主线特征)

• 加密cookies

• 密码存储

• 你不需要知道现时值是什么,你也不需要特别关注认证加密。Halite会帮你做好一切。

我们创建Halite以供PHP开发者通过一个更简单的接口获取libsodium拓展的所有安全性优势。查看Halite的相关文件就能知道它的使用是多么简便。(尽管 API 是固定的,Halite帮助文件依然是不完善的。然而它已经足以涵盖入门级的内容。)

唯一的缺陷是你必须安装PHP的libsodium扩展包才能使用Halite。因此对于很多项目来说,Halite方式是行不通的。

安装指南:

  1. 安装PHP的libsodium扩展包
  2. 需要 paragoniehalite`

很显然,如果你不喜欢我们对于Halite所做的决策,那么可以考虑直接使用libsodium。

使用libsodium的优势

• 对称密钥加密认证(同:AEAD)

• 对称密钥认证

• 非对称密钥认证加密

• 非对称密钥匿名加密

• 非对称密钥数字签名

• 加密哈希函数

• 密码存储

• 瑞士军刀式的密码学原语(比如:基于Curve25519的Diffe-Hellman密钥交换协议的椭圆曲线)

• 在PHP中的内存清除(补零)能力

• 还有好多

请向Frank Denis以及创作了NaCl(libsodium由此分生)的小组致敬,因为libsodium一直是世界上最可靠的,跨平台的密码学库。

安装指南

请参阅相关文件。

PHP Encryption – 来自 Defuse Security

如果你不能从PECL(也就是永远不能安装libsodium)安装PHP拓展包,这个密码库应该是你的备用选择。通常情况下,不论你的框架提供了什么方案,你都应该优先考虑它,因为我们的安全小组经常能发现PHP框架提供的对称密钥加密功能的缺陷。

使用Defuse Security 的 PHP密码库的优势:

• Symmetric-key authenticated encryption

• 对称密钥认证加密

它解决了大多数人都会遇到的一个问题(并且解决得非常棒)。该密码库的第二版(即将发布!)将同样涵盖全文件加密,但是由于它还未发布,因此我们还不能以此为加分项。

Phpseclib - Jim Wigginton, et al. (仅对 RSA 而言)

如果你一定要安装对称密钥加密,请使用上述的Defuse的密码库。Defuse Security的密码库为你提供了认证加密,而phpseclib的AES实施并不会验证密文。因此如果你使用它,你对选择密文攻击的抵抗力将十分脆弱。(他们的交互文件在ECB模式下同样出错严重,是我们提过的最坏分组密码模式。)

尽管phpseclib为通用对称秘钥加密方式提供的 API 等级过低,使得我们不愿向缺乏密码学背景的PHP开发者在这种使用方式下推荐它,但是它相对extopenssl而言提供了一种更好的非对称秘钥加密方式。

如果你坚持必须使用非对称秘钥加密方式(公共秘钥加密,电子签名)并且出于各种原因无法使用libsodium,那么你就应该考虑安装phpseclib,并且严格遵循Colin Percival提出的密码算法的正确解答。

特别注意

  • RSA加密算法:RSA-OAEP(最优不对称加密填充),首先考虑
    $rsa-setMGFHash('sha256')
  • RSA
    签名加密:RSA-PSS(probabilistic
    signature scheme),再次明确指定使用MGF1+SHA256

如果你刚好是一位密码学专家,那你可以忽略我们的警示信息,使用phpseclib提供的对称秘钥加密方式。但是对大多数非密码学专家的编程者来说,请最好不要忽略我们的提示。

使用PHPSecLib的优势:

  • 对称秘钥认证(通过HMAC秘钥,PHP同样提供)
  • 非对称秘钥匿名加密(RSA)
  • 非对称秘钥电子签名方式(RSA)

更新内容 (2015-11-19) Easy RSA

在本篇博客发布以后,我们又针对建议开发了插入式安装包,EasyRSA。EasyRSA是一种方向确定且默认安全设置的phpseclib使用。

EasyRSA加密过程

问题:使用RSA加密一段超大字符串,即使RSA本身也不支持加密超大字符串数据。

原始解决方案是将你输入的字符串切分分块并单独分别加密。然而这和可怕的电码本(ECB)模式十分相似。同样的:它的处理进程也十分缓慢。这是个非常糟糕的解决方案。

我们的解决方案

  • 生成临时秘钥
  • 使用Defuse Security的PHP对称秘钥加密密码库加密您的消息
  • 使用已有RSA公共秘钥加密临时秘钥(一种对padding oracles攻击方式抵抗效果良好的方式)
  • 基于64位编码,并且使用版本标记前缀来连接密文
  • 附加第四步中的校验和(截取的哈希SHA256加密算法)来增强传输存储错误检测能力。

要解密一段消息

  1. 验证检验和和版本标记
  2. 使用正确RSA私钥来解密临时秘钥
  3. 使用上一步获取的解密秘钥来获取明文

EasyRSA只使用RSAES-OAEP + MGF1-SHA256 with e = 65537来进行公钥加密,已知此种加密方式对任何padding oracle攻击都是有良好抵抗力的。

EasyRSA 签名方式

RSA签名方式是相对直接的:使用RSASS-PSS + MGF1-SHA256 with e = 65537来计算RSA签名,然后校验它是否设定为仅接受此种签名。

但是认真讲,如果你真的想为你的PHP程序找到一种确保安全的加密方式,请尝试寻找能使用libsodium的方式。我们正推动使libsodium成为PHP7.1中的核心拓展包,因此希望它的使用能够在将来同“更新新版PHP”一样简单。

关于我们提供的PHP加密库建议

那其他密码库呢?

任何未在上文提及的密码库的落选原因都可以由以下三条可能原因解释:

  1. 我们审核了该密码库,但是凭心而论并不足以让我们进行推荐。(有可能我们已经告知创作者其密码库存在缺陷,以便他们加以改进。)
  2. 密码库使用范围太窄(比如Crypt GPG),或者尽管安全,它和加密的广泛使用情况并不相关。
  3. 我们太忙了,还没审核该密码库。(我们可能还不知道有这个密码库的存在。)

如果你对我们认定有缺陷的密码库感兴趣,请查看安全建议页以获取更多信息。

在PHP中,我们应该使用何种方式加密密码?

你不需要加密密码,你只需要用合适的密码散列算法(哈希密码算法)来杂乱密码。当前的最佳密码库之一是PHP内建的: password_hash() andpassword_verify()。这种散列算法对99%的编程者或企业来说都是稳定有效的。这个算法就是这么棒。

然而,如果你将数据库中的密码存储在你网页应用的不同服务器中,你可以通过加密散列(而不是加密密码本身)来减轻密码入侵风险。要使用这种方式,请查看Halite密码课程。

重要的安全建议免责声明

尽管我们雇佣了一些PHP开发安全的行业顶尖专家(并且我们精于应用密码学),在不了解你的特定项目要求和风险模型的前提下,他们在写作这篇向导时并不能指引你选取最符合需求的解决方案。

因此如果,比如,你需要使用非对称加密算法,还执意选择使用Defuse Security的对称加密密码库,请不要说“是Paragon Initiative Enterprises让我这么干的!”

如果你想根据自己的特定项目获得我们的安全建议,请考虑雇用我们进行安全咨询服务。

或者用法律术语说:此文信息不提供任何担保,使用风险自负。

原文地址:Choosing the Right Cryptography Library for your PHP Project: A Guide

时间: 2024-09-18 14:26:34

为你的PHP程序选择合适的密码库(初稿)的相关文章

想开发云应用程序?先选择合适的PaaS!

从一个方面来分析,开发云应用程序的平台即服务模式有两种:一种是专用模式,托管在本地或私有云中;另一种是公共模式,由第三方提供商来托管,并采用订阅支付模式.那只是问题的一个方面.还可以以一种全然不同的方式来分析PaaS:这种方式基于与云环境的联系. 据长期的IT和云计算顾问Judith Hurwitz声称,从这种联系的角度来分析PaaS,会发现存在两种不同的模式.其中之一是,PaaS与某个特定的软件即服务(SaaS)环境联系在一起,比如Salesforce的Force.com和Heroku Ent

android通过蓝牙接收文件打开时无法自动选择合适的应用程序_Android

通过蓝牙接收文件,从历史传输记录打开,无法自动选择合适的应用程序 但是从file manager打开这个新接收的文件,是可以选择对应的应用程序(比如video player打开.3gp..mp4文件) 历史传输记录打开download的文件,是通过接收文件时对方传过来的mime type来选择适合的APP打开该文件 如果出现提示"未支持格式的文件",或者使用了错误的APP来打开该文件 原因在于发送方发送文件时填的mime type存在问题 如下的log是mtk接收方的log,请注意黄色

选择合适的java脚本语言

脚本 选择合适的java脚本语言--如果你正考虑在java应用中集成脚本解释器,最难得是决定使用那种 摘要:脚本语言已经向java开发者证明了它的价值.它让客户实现应用功能的扩展和界面的个性化,从而程序的价值得以提升.另外,它们可以显著的简化程序开发者的设计任务,通过实现动态定义.装载和评估.对于开发人员,集成一种或多种脚本语言的任务是简单的,从越来越长的可选列表中选出一个确实困难的.本文描述了一些伴随java应用中脚本语言支持的问题,并从不同角度比较了Groovy, JudoScript, P

《Python硬件编程实战》——2.3 如何选择合适的版本

2.3 如何选择合适的版本 选择合适的Python版本主要包含如下两方面含义: 选择Python 2还是Python 3 选择32位(x86)还是64位(x64) 下面来详细介绍它们的具体含义.2.3.1 选择Python 2还是Python 3 通过前面的介绍,读者已经清楚Python 2和Python 3的区别了.但是作为普通Python使用者来说,到底是选择Python 2还是Python 3呢?在给出笔者的建议之前,此处先总结一下它们各自的优缺点,如表2-1所示. 从表2-1的对比和结论

如何选择合适的企业移动性管理工具

随着移动设备管理的不断变化,你可以考虑现在所需要的EMM功能以及将来可能需要的功能--不要忽视用户体验. "移动办公人员"这个指称几乎是多余的,因为现在很多员工都以某种方式使用移动设备.管理这个庞大而不断扩大的环境对于IT来说仍然是一个巨大的挑战,对越来越多的企业而言,企业移动管理性管理(enterprise mobility management,EMM)是选择的解决方案. 最近的行业研究显示对EMM产品的需求的预期增长,其中通常包括移动设备管理(MDM).移动应用管理(MAM).移

为Hadoop集群选择合适的硬件配置

随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件规格列表那么简单. 选择硬件,为给定的负载在性能和经济性提供最佳平衡是需要测试和验证其有效性.(比如,IO密集型工作负载的用户将会为每个核心主轴投资更多). 在这个博客帖子中,你将会学到一些工作负载评估的原则和它在硬件选择中起着至关重要的作用.在这个过程中,你也将学到Hadoop管理员应该考虑到各种

NoSQL系列:选择合适的数据库

NoSQL系列:选择合适的数据库 为什么使用NoSQL数据库? 1.阻抗失衡 关系模型和内存中的数据结构不匹配 采用更为方便的数据交互方式提升开发效率 2.待处理的数据量很大 数据量超过关系型数据库的承载能力 大集群的出现 在成本方面,集群中应用关系数据库,许可费用是一笔很大的支出: 横向扩展和纵向扩展:关系数据库一般只能是纵向扩展,通过对单机服务器的性能换代增强而实现:而对于扩展到多个服务器, DBMS先天不足:(DBMS不是设计给集群使用的) 3.对数据的访问效率要求高 NoSQL数据库的分

如何选择合适我的云服务器?

如何选择合适的云服务器? 云服务器的配置选择,和网站或应用的类型.访问量.数据量大小.程序质量等因素有关,建议和网站或应用的开发技术人员沟通,选择最适合自己业务场景的配置. 如果没有技术人员可提供建议,不妨参考云服务器厂商提供的配置方案,像1核1GB 1M的入门型适用于个人网站初始阶段:1核 2GB 1M的基础型适合流量适中的网站应用,或简单开发环境.代码存储库等.另外,像阿里云还有专门针对网站.电商.游戏.移动app等不同行业的解决方案供参考. 怎样选择云服务器? 选择云服务器的配置的话就要主

Biwin佰维:企业如何选择合适的SSD

跟机械硬盘一样,SSD也被分为消费级产品和企业级产品,相比于消费级市场,企业级市场的普及难度更大,因为企业级市场对产品的稳定性.可靠性等方面要求更高, 目前,企业级市场尚处在发展阶段,厂商鱼龙混杂,对于很多企业用户来说,如何选择合适的企业级SSD厂商将是他们需要慎重考虑的事情. ◆ 硬件提升,数据更安全 对于企业用户来说,安全性是最敏感的地方.断电保护.一键擦除等功能使用在一定程度上让数据安全有了更好的保障.深圳佰维存储科技股份有限公司(简称:佰维)企业级SSD X50通过内置电源侦测芯片实时监