原文:
PHP函数参考06-加密扩展 - 9ong
PHP函数参考07-数据库扩展 - 9ong
加密安全的随机数字或字符
如果有需要加密安全的随机数字或字符,官方建议使用random_int、random_bytes,而不是rand函数,当然他们都是伪随机函数。
echo rand(-1000,1000)."<br />";
echo random_int(-1000, 1000)."<br />";
echo bin2hex(random_bytes(2));
//848
//-112
//5cf1
Hash哈希
哈希,其实是信息摘要。信息摘要引擎允许使用各种哈希算法直接或增量处理任意长度的信息。
- hash_aogos,在 PHP 7.4.0 中,hash_algos() 会返回下表所示的算法清单,目前大约有53种算法。比如常用的md5、sha256等
- hash,最常用的哈希函数,hash(算法 , 数据 , true返回二进制或false返回16进制字符串),默认返回16进制字符串。
- hash_file,除了数据是一个文件符外,其他和hash函数一样,也就是将给定的文件内容生成哈希值
- hash_init,这里提到一个增量哈希,hash和hash_file都是一次性将数据或文件内容生成哈希值,增量哈希可以逐步多次通过hash_update等函数,增量填充要要计算哈希的数据或文件或数据流,hash_init,相当于先初始化设置本次哈希的算法等上下文信息,特别是对于hash_hmac需要提供密钥的算法。
- hash_update,向活跃的哈希运算上下文中填充数据,在一次哈希运算上下文中,可以多次填充数据
- hash_update_file,hash_update_stream,同hash_update一样,只是数据来源与文件或数据流
- hash_final,结束本次哈希运算上下文,并返回摘要信息结果。通常是hash_init初始化上下文,hash_update相关函数填充上下文数据,hash_final最后返回哈希摘要结果,同样的有一个raw_output参数用于设置返回二进制或16进制字符串。
- hash_copy,可以复制一个哈希上下文,不影响上一次的哈希上下文,可以单独用于另外的哈希计算,两个上下文相互不影响。
- has_hmac,首先我们要了解下hmac是什么,hmac是利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。hash_hmac就是使用 HMAC 方法生成带有密钥的哈希值。更多参考Hash, MAC,HMAC - Songhan - 博客园。
Mcrypt扩展
在php7之前,phper还是很喜欢用到这个扩展的,但:
官方警告:该特性在PHP 7.1.0中已弃用,在PHP 7.2.0中已删除。
Mcrypt扩展大都是mcrypt_开头的函数,比如mcrypt_encrypt 、mcrypt_decrypt 、mcrypt_create_iv 等
这里提出来,最重要的还是传播给大家:
Warning:本函数已自 PHP 7.1.0 起废弃并将自 PHP 7.2.0 起移除。强烈建议不要使用本函数。
Warning:本函数已自 PHP 7.1.0 起废弃并将自 PHP 7.2.0 起移除。强烈建议不要使用本函数。
Warning:本函数已自 PHP 7.1.0 起废弃并将自 PHP 7.2.0 起移除。强烈建议不要使用本函数。
mhash扩展
Note: This extension is obsoleted by Hash. 这个扩展已经过时。
请使用hash相关函数。
OpenSSL
本扩展使用 OpenSSL 库来对称/非对称加解密,以及 PBKDF2、 PKCS7、 PKCS12、 X509 和其他加密操作。除此之外还提供了 TLS 流的实现。
openssl相关函数很多,涉及到对称加密、非对称加密,甚至ssl证书,要展开讲可以写好几篇文章,现在通信都需要数据加密防被破解,需要签名防篡改。
-
对称加密算法
对称加密常用的算法有:AES 、DES 、3DES 、 IDEA 、 RC2 、 RC5 等,比较常用的是 AES 和 DES 。
-
非对称加密算法
非对称加密常用的算法有:RSA 、Elgamal 、ECC 等,RSA 非常常用和普遍,SSL 和一些证书算法都是基于 RSA 。
非对称的实现需要一对密钥,也就是我们常说的公钥和私钥,比如通过openssl_pkey_new生成私钥,而公钥其实是从私钥中抽取出来的,所以实际上我们进行非对称加解密的时候,私钥和公钥加解密可以相互操作,公钥加密再通过私钥解密,或者私钥加密再通过公钥解密,也就是双方通信都可以做到发送加密数据给对方,同时可以解密对方发送的数据,保证数据不暴露。
-
经典加密技术:数字信封
我们平常使用的加密技术,通常是数字信封的方式,就是利用对称加密和非对称加密方式各自的优点。非对称加密的安全性高,但速度慢,而且数据量越大速度越慢,那么我们就用它来加密对称加密的 key ,通常这个 key 不会很大。然后实际的数据实体使用这个对称加密的 key 来进行对称加密提升速度。这样,我们发送给客户端时,就包括两个内容,一个是非对称加密进行加密的 key ,一个使用对称加密进行加密的数据内容。客户端拿到信息后,首先使用非对称加密的密钥解码出对称加密的 key ,然后再使用这个 key 来解密最终的数据内容。
-
签名与验签
为了保证数据通信过程中,不会被截获篡改数据,我们需要一种技术来验证数据是否被篡改过,那就是我们常用的签名与验签。
我们可以通过哈希摘要的方式生成签名并验签,同样OpenSSL也提供了openssl_sign与openssl_verify等函数完成签名与验签操作。
两者的区别也可以叫做对称与不对称,但这里的对称是指使用了相同密钥或key(不能对外泄露),而openssl的签名与验签还是通过私钥与公钥分别签名与验签,比如使用公钥签名,对方使用私钥验签,或者反过来也可以。
-
证书
x509 是标准的公钥证书规范。通过 openssl_csr_sign() 这个函数,为 CSR 进行签名后获得的就是 x509 规范的一个证书内容。在这个证书中是可以提取出公钥信息的,我们可以将这个证书颁发给用户或者客户端,然后由客户端从证书中抽取公钥信息来进行数据加密。
-
详细的openssl函数使用
PHP的OpenSSL加密扩展学习(一):对称加密 - 知乎
PHP的OpenSSL加密扩展学习(二):非对称加密 - 知乎
PHP的OpenSSL加密扩展学习(三):证书操作 - 知乎
或者
密码散列算法函数
password_hash() 使用足够强度的单向散列算法创建密码的散列。password_hash() 会为每个密码散列自动生成随机的盐值。
$password = "chinese";
$pwdHash = password_hash($password, PASSWORD_DEFAULT);
//$pwdHash2 = password_hash($password, PASSWORD_BCRYPT);
if(password_verify($password, $pwdHash)){
echo "密码正确";
}else{
echo "密码错误";
}
sodium
Sodium一个易于使用的可为我们提供加密、解密、签名,密码哈希等功能的软件库。除了自身强大的功能外,它还为我们提供了一个兼容API和一个外部API,以进一步的帮助我们提高其可用性。Sodium的目标是提供构建更高级别加密工具所需的所有核心操作。
php也在第一时间支持了sodium模块,但官方文档正进一步完善中。
关于openssl与sodium:
PHP Encryption with Libsodium | Zend by Perforce
Replacing OpenSSL with Libsodium