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

文哥博客(https://wenge365.com)属于文野个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接