PHP 加密:AES & RSA

最近两年一直从事与金融相关项目的开发与维护。但是,关于 PHP 加密解密的最佳实践,网上没有人给出一个完美的总结。恰逢最近看了《图解密码技术》一书,对 PHP 加解密有了更深刻的认识。

为了避免各位看枯燥的文字理论,开篇我就把总结给出:

AES 是对称加密、RSA 是非对称加密。截止目前为止,对称加密用 AES 算法且分组模式使用 CBC,非对称加密用 RSA 算法。

一、对称加密
对称加密的特点是加解密速度快,加密后的密文强度目前还没有硬解的可能性。但是,在未来随着计算机性能的提升有可能会出现被破解的可能性。

对称加密的缺点也很明显。对称加密的加密过程与解密过程使用的是同一把密钥。一旦泄漏密钥,加密就失去了任何意义。

根据《图解密码技术》一书的推荐,对称加密目前推荐使用 AES。在 PHP 当中要实现 AES 加解密,是使用 openssl 扩展来实现。所以,请确保你的 PHP 已经开启了 openssl 扩展。

可以通过如下方式检测:

[root@localhost ~]# php -m|grep openssl
openssl

或者如下方式检测:

[root@localhost ~]# php --ri openssl

openssl

OpenSSL support => enabled
OpenSSL Library Version => OpenSSL 1.0.2k-fips  26 Jan 2017
OpenSSL Header Version => OpenSSL 1.0.2k  26 Jan 2017
Openssl default config => /etc/pki/tls/openssl.cnf

Directive => Local Value => Master Value
openssl.cafile => no value => no value
openssl.capath => no value => no value

AES 的加密模式属于分组密码模式。所谓分组密码,是加密时把明文按照固定的长度分组,然后再进行加密。当然,细节之处很很多不同。AES 分组模式有多种:ECB、CBC、CFB、OFB、CTR 五种分组模式。目前优先推荐使用 CBC 模式。

如果使用 CBC 模式,那么在加密的时候,就需要一个前置的加密向量 IV。当初博主在使用 AES 来加密的时候,就很奇怪一个对称加密为何要这个向量。因为,在博主寒冰的潜意识里,对称加密只需要一个密钥就 Ok 了。没想到 AES 加密还有多种模式,而这个 CBC 模式恰恰就需要一个这样的向量值。关于这个向量大家可以在网上查阅相关的资料。这个东西非常重要,也非常好理解。

关于 PHP AES 加解密会用到的相关方法:

openssl_encrypt() // 加密。
openssl_decrypt() // 解密。
openssl_cipher_iv_length() // 获取密码 iv 长度。
openssl_random_pseudo_bytes() // 生成一个伪随机字节串
openssl_get_cipher_methods() // openssl 所支持的算法列表。

AES 支持三种强度:128、192、256。128 位的强度最低,但是,加密解密速度较快。256 位强度最高,但是,加密解密速度最低。所以,大家根据自己系统的重要程度选择使用对应强度。通常普通的金融项目使用 192 位完整够用了。顶级的就用 256 位。其他的就用 128 位吧。

二、非对称加密
非对称加密是指公钥加密私钥解密,私钥加密公钥解密的算法。非对称加密的算法有很多。《图解密码技术》一书推荐使用 RSA 算法。它使用起来也非常简单。

要使用 RSA 算法。首先,我们必须生成一对公钥私钥。其实生成公钥私钥很简单。

在 Linux 系统,直接使用如下命令生成:

$ ssh-keygen -t rsa -b 4096

此命令会生 ~/.ssh/ 目录下生成两个文件:

[root@localhost .ssh]# ll
总用量 12
-rw------- 1 root root 3243 11月  7 10:09 id_rsa
-rw-r--r-- 1 root root  752 11月  7 10:09 id_rsa.pub

id_rsa 是私钥,is_rsa.pub 是公钥。

关于 PHP RSA 加解密会用到的相关方法:

openssl_pkey_get_private() // 获取私钥
openssl_pkey_get_public() // 从证书中解析公钥,以供使用
openssl_private_decrypt() // 使用私钥解密数据
openssl_private_encrypt() // 使用私钥加密数据
openssl_public_decrypt() // 使用公钥解密数据
openssl_public_encrypt() // 使用公钥加密数据

以上就是关于在 PHP 项目开发中,我们使用的加密解密算法的一个总结。博主寒冰在总结过程中难免会有不足之处,还请大家指正!谢谢!

博主 2011 年创建了一个《PHP 初学者官方群》,目前群成员 500 人左右。群号:168159147。为了防止广告,设置为付费入群。欢迎大家加入讨论技术!

标签: 无

发表评论: