php数据传输加密算法 php 数据加密( 二 )


openssl s_server key mykey pem cert mycert pem 连接SSL服务器到 客户端会获得服务器的证书:
lishixinzhi/Article/program/PHP/201311/20914
PHP对称加密-AES 对称加解密算法中 , 当前最为安全的是 AES 加密算法(以前应该是是 DES 加密算法) , PHP 提供了两个可以用于 AES 加密算法的函数簇php数据传输加密算法: Mcrypt和OpenSSL。
其中 Mcrypt 在 PHP 7.1.0 中被弃用(The Function Mycryptis Deprecated) , 在 PHP 7.2.0 中被移除,所以即可起你应该使用 OpenSSL 来实现 AES 的数据加解密 。
在一些场景下,我们不能保证两套通信系统都使用了相函数簇去实现加密算法 , 可能 siteA 使用了最新的 OpenSSL 来实现了 AES 加密,但作为第三方服务的 siteB 可能仍在使用 Mcrypt 算法,这就要求我们必须清楚 Mcrypt 同 OpenSSL 之间的差异,以便保证数据加解密的一致性 。
下文中我们将分别使用 Mcrypt 和 OpenSSL 来实现 AES-128/192/256-CBC加解密 , 二者同步加解密的要点为:
协同好以上两点,就可以让 Mcrypt 和 OpenSSL 之间一致性的对数据进行加解密 。
AES 是当前最为常用的安全对称加密算法,关于对称加密这里就不在阐述了 。
AES 有三种算法,主要是对数据块的大小存在区别:
AES-128:需要提供 16 位的密钥 key
AES-192:需要提供 24 位的密钥 key
AES-256:需要提供 32 位的密钥 key
AES 是按数据块大?。?28/192/256)对待加密内容进行分块处理的,会经常出现最后一段数据长度不足的场景 , 这时就需要填充数据长度到加密算法对应的数据块大小 。
主要的填充算法有填充 NUL("0") 和 PKCS7,Mcrypt 默认使用的 NUL("0") 填充算法,当前已不被推荐 , OpenSSL 则默认模式使用 PKCS7 对数据进行填充并对加密后的数据进行了 base64encode 编码,所以建议开发中使用 PKCS7 对待加密数据进行填充 , 已保证通用性(alipay sdk 中虽然使用了 Mcrypt 加密簇,但使用 PKCS7 算法对数据进行了填充 , 这样在一定程度上亲和了 OpenSSL 加密算法) 。
Mcrypt 的默认填充算法 。NUL 即为 Ascii 表的编号为 0 的元素,即空元素 , 转移字符是 "\0",PHP 的 pack 打包函数在 'a' 模式下就是以 NUL 字符对内容进行填充的,当然,使用 "\0" 手动拼接也是可以的 。
OpenSSL的默认填充算法 。下面我们给出 PKCS7 填充算法 PHP 的实现:
默认使用 NUL("\0") 自动对待加密数据进行填充以对齐加密算法数据块长度 。
获取 mcrypt 支持的算法,这里我们只关注 AES 算法 。
注意:mcrypt 虽然支持 AES 三种算法,但除MCRYPT_RIJNDAEL_128外 ,  MCRYPT_RIJNDAEL_192/256并未遵循AES-192/256标准进行加解密的算法,即如果你同其php数据传输加密算法他系统通信(java/.net),使用MCRYPT_RIJNDAEL_192/256可能无法被其他严格按照AES-192/256标准的系统正确的数据解密 。官方文档页面中也有人在 User Contributed Notes 中提及 。这里给出如何使用 mcrpyt 做标注的AES-128/192/256加解密
即算法统一使用MCRYPT_RIJNDAEL_128,并通过 key 的位数 来选定是以何种 AES 标准做的加密,iv 是建议添加且建议固定为16位(OpenSSL的 AES加密 iv 始终为 16 位,便于统一对齐) , mode 选用的 CBC 模式 。
mcrypt 在对数据进行加密处理时 , 如果发现数据长度与使用的加密算法的数据块长度未对齐,则会自动使用 "\0" 对待加密数据进行填充,但 "\0" 填充模式已不再被推荐,为了与其他系统有更好的兼容性,建议大家手动对数据进行 PKCS7 填充 。
openssl 簇加密方法更为简单明确 , mcrypt 还要将加密算法分为 cipher + mode 去指定 , openssl 则只需要直接指定 method 为AES-128-CBC , AES-192-CBC,AES-256-CBC即可 。且提供了三种数据处理模式,即默认模式 0 /OPENSSL_RAW_DATA /OPENSSL_ZERO_PADDING。

推荐阅读