PHP 加密:AES & RSA

栏目: 编程工具 · 发布时间: 7年前

内容简介:最近两年一直从事与金融相关项目的开发与维护。但是,关于 PHP 加密解密的最佳实践,网上没有人给出一个完美的总结。恰逢最近看了《图解密码技术》一书,对 PHP 加解密有了更深刻的认识。为了避免各位看枯燥的文字理论,开篇我就把总结给出:AES 是对称加密、RSA 是非对称加密。截止目前为止,对称加密用 AES 算法且分组模式使用 CBC,非对称加密用 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 项目开发中,我们使用的加密解密算法的一个总结。博主寒冰在总结过程中难免会有不足之处,还请大家指正!谢谢!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Practice of Programming

The Practice of Programming

Brian W. Kernighan、Rob Pike / Addison-Wesley / 1999-2-14 / USD 49.99

With the same insight and authority that made their book The Unix Programming Environment a classic, Brian Kernighan and Rob Pike have written The Practice of Programming to help make individual progr......一起来看看 《The Practice of Programming》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具