PHP字符串加密解密函数(带时效限制)

2024-01-21 13:48

本文主要是介绍PHP字符串加密解密函数(带时效限制),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大牛们总是能深入的了解到一些东西,比如下面这篇文章,从DZ中挖掘出一个好用的函数。围观之…

最近, 从discuz里面发现了一个很牛的加密解密函数。

此函数的厉害之处在于可以在指定时间内加密还原字符串,超时无法还这样我们就可以拿此函数来做很多用途了,比如:单点登录的token加密传输啦,临时密码啦等等

 

01<?php
02/**
03  * @param string $string 原文或者密文
04  * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE
05  * @param string $key 密钥
06  * @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效
07  * @return string 处理后的 原文或者 经过 base64_encode 处理后的密文
08  *
09     * @example
10     *
11     *  $a = authcode('abc', 'ENCODE', 'key');
12     *  $b = authcode($a, 'DECODE', 'key');  // $b(abc)
13     *
14     *  $a = authcode('abc', 'ENCODE', 'key', 3600);
15     *  $b = authcode('abc', 'DECODE', 'key'); // 在一个小时内,$b(abc),否则 $b 为空
16*/
17  
18function authcode($string, $operation = 'DECODE', $key = '', $expiry = 3600) {
19    $ckey_length = 4;  
20    // 随机密钥长度 取值 0-32;
21    // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。
22    // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
23    // 当此值为 0 时,则不产生随机密钥
24  
25    $key = md5($key ? $key : EABAX::getAppInf('KEY'));
26    $keya = md5(substr($key, 0, 16));
27    $keyb = md5(substr($key, 16, 16));
28    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
29  
30    $cryptkey = $keya.md5($keya.$keyc);
31    $key_length = strlen($cryptkey);
32  
33    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
34    $string_length = strlen($string);
35  
36    $result = '';
37    $box = range(0, 255);
38  
39    $rndkey = array();
40    for($i = 0; $i <= 255; $i++) {
41        $rndkey[$i] = ord($cryptkey[$i % $key_length]);
42    }
43  
44    for($j = $i = 0; $i < 256; $i++) {
45        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
46        $tmp = $box[$i];
47        $box[$i] = $box[$j];
48        $box[$j] = $tmp;
49    }
50  
51    for($a = $j = $i = 0; $i < $string_length; $i++) {
52        $a = ($a + 1) % 256;
53        $j = ($j + $box[$a]) % 256;
54        $tmp = $box[$a];
55        $box[$a] = $box[$j];
56        $box[$j] = $tmp;
57        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
58    }
59  
60    if($operation == 'DECODE') {
61        if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
62            return substr($result, 26);
63        } else {
64            return '';
65        }
66    } else {
67        return $keyc.str_replace('=', '', base64_encode($result));
68    }
69  
70}

这篇关于PHP字符串加密解密函数(带时效限制)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/629747

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数