php数字和字符串可逆加密及加密算法基础
所属分类:php | 发布于 2023-02-14 20:27:09
事情的起由是一般项目中的id都是自增的整数型,这样在浏览器中访问的时候会把id显示在url上,比如我这个博客的文章详情页面Url地址,从上面能直接看到数据库中存储的主键id值,感觉这样不好,于是想找一个能把数字转字符串的加密算法,要求是算法是可逆的,由字符串也能解密得到原始的整数id。
网上出现最多的是discuz上面出现的可你加密算法,但是它是十多年前就出现的,不太想用。于是又继续搜寻。又学了一圈下来,才发现加密算法有这么多知识,自己这个十多年的老程序员基础还真是薄弱呀。趁这个机会来简单整理一下加密算法相关的知识。
先来理清学习思路,一句话就能讲清楚,加密算法分为可逆加密和不可逆加密两类,可逆加密算法下面又分为对称加密和非对称加密两种。之前一直以为对称加密就是可逆加密,非对称加密就是不可逆加密,想想真是搞笑。
一、不可逆加密
一旦加密就不能反向解密得到密码原文。最常见的用途是用来加密用户密码。
常见的不可逆加密算法有MD5、SHA、HMAC等。
二、可逆加密
可逆加密有对称加密和非对称加密两种。
2.1、对称加密
加密和解密使用相同的秘钥,即加密秘钥也作为解密秘钥。
对称加密的优点是算法公开、计算量小、加密速度快、加密效率高;缺点是秘钥必须是双方约定好的,固定的,一旦秘钥被泄露,那么加密的信息也就不安全了。
常见的对称加密算法有AES、DES等。
2.2、非对称加密
非对称加密算法需要两个秘钥,公开秘钥(Public key)和私有秘钥(Private key)。
甲方生成一对秘钥并将其中的一把作为公共秘钥向其它方公开;得到该公钥的乙方使用该秘钥对机密信息进行加密后再发送给对方;甲方再用自己保存的另外一个秘钥对加密后的信息进行解密。甲方只能用其专用秘钥解密其由公用秘钥加密后的任何信息。
非对称加密算法的优点是安全,缺点是速度较慢。
常见的非对称加密算法有RSA、DSA(数字签名用)等。
三、php对称加密实现整型和字符串互转
php中对称加密算法中最常用的AES,其中基于mcrypt的加密算法已经在php7.4中废弃了,现在使用AES一般使用基于openssl的加密算法。
直接上代码:
function intToString($int)
{
// key 32位的字符串
$secret_key = "4o6dhzAJZ1yKs5WLiDUSCRrOmE2P9clF";
// iv, 16为的字符串
$secret_iv = "r0twZ97mbJpdO1DA";
// 加密方式
$encrypt_method = "AES-128-CBC"; // 还有可选值 AES-192-CBC, AES-256-CBC
return base64_encode(openssl_encrypt($int,$encrypt_method, $secret_key, 0, $secret_iv));
}
function stringToInt($string)
{
// key 32位的字符串
$secret_key = "4o6dhzAJZ1yKs5WLiDUSCRrOmE2P9clF";
// iv, 16为的字符串
$secret_iv = "r0twZ97mbJpdO1DA";
// 加密方式
$encrypt_method = "AES-128-CBC"; // 还有可选值 AES-192-CBC, AES-256-CBC
return openssl_decrypt(base64_decode($string),$encrypt_method, $secret_key, 0, $secret_iv);
}
$int = 100;
echo intToString($int); // ZzhJVWY0YnJoT1ZEQUNFbENzTnNXZz09
echo "<br/>";
$string = 'ZzhJVWY0YnJoT1ZEQUNFbENzTnNXZz09';
echo stringToInt($string); // 100