## RSA密文过长加密解密 越过1024的解决代码
> 什么是RSA加密?
[RSA ](https://en.wikipedia.org/wiki/RSA)(详见维基百科)算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法,与 md5 和 sha1 不同,到目前为止,也只有极短的RSA加密被破解。
> 使用场景
* 为移动端(IOS,安卓)编写 API 接口
* 进行支付、真实信息验证等安全性需求较高的通信
* 与其他第三方或合作伙伴进行重要的数据传输,用于外部商户系统和本系统之间报文的安全性验证。
> 生成私钥、公钥
**1、生成原始 RSA 私钥文件**
```
openssl genrsa -out private_key.pem 1024
```
说明:生成RSA私钥,`private_key.pem` 为存放私钥的文件名,长度1204
**2、将原始 RSA 私钥转换为 pkcs8 格式**
```
openssl pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt -out rsa_private_key.pem
```
说明:把RSA私钥转换成PKCS8格式,转化后的私钥 `rsa_private_key.pem`
**3、生成 RSA 公钥**
```
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
```
说明:生成RSA公钥文件` rsa_public_key.pem`
**4、最后会有三个文件**
```
λ ls
private_key.pem rsa_private_key.pem rsa_public_key.pem
```
文本打开`rsa_private_key.pem`、`rsa_public_key.pem`,里面存放的是私钥、公钥。商户需要把公钥字符串发给易付宝的业务人员,私钥商户自行保存。
[php-rsa 加密解密](https://segmentfault.com/a/1190000012083428)
Rsa 服务器类库
```
<?php
/**.-------------------------------------------------------------------------------------------------------------------
* | Github: https://github.com/Tinywan
* | Blog: http://www.cnblogs.com/Tinywan
* |--------------------------------------------------------------------------------------------------------------------
* | Author: Tinywan(ShaoBo Wan)
* | DateTime: 2018/8/30 22:48
* | Mail: 756684177@qq.com
* | Desc: php-rsa 加密解密 https://segmentfault.com/a/1190000012083428
* '------------------------------------------------------------------------------------------------------------------*/
namespace app\common\library;
class Rsa
{
/**
* @var array 默认配置
*/
private $_config = [
'public_key' => '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbtLA7lMfUvpBgfgzouiPgcnbL
DnEcuCK0gMub/EAEqmr82sl+9tH1iQb1w/hgQLptVRxAuUOa03XqlnG3wkAegtQt
4Q5ZtHSSomE8/5FXJvQfGTCz5RARyM0MiLTMZJGhLdVT6O8uCYIrPRQq7u6NVLs9
6YDmtzX2do/sTsWCAwIDAQAB
-----END PUBLIC KEY-----',
'private_key' => '-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCbtLA7lMfUvpBgfgzouiPgcnbLDnEcuCK0gMub/EAEqmr82sl+
9tH1iQb1w/hgQLptVRxAuUOa03XqlnG3wkAegtQt4Q5ZtHSSomE8/5FXJvQfGTCz
5RARyM0MiLTMZJGhLdVT6O8uCYIrPRQq7u6NVLs96YDmtzX2do/sTsWCAwIDAQAB
AoGAfnO3zCuAPp6k0jiMc1T4XgeXwkDwS8qfJMiUkxHBTAi66q8khSAeU7H9HQsS
Y9ktji1YzJeo98xULzgPEpWHS/uhA8VZa16TLy9Yfadn2t+wpWpEJ9ZA4jjEqfQj
DDxcUc/pEv5siaE/bU8uls4o2nAiuWnI2n5FGrQa2OziGUECQQDPOh3KD2AOZtEF
p7i0yxYXe4dCKwenfw5q7l933RgqMXsVR1EAGzAUdIs71hTye6ibhva+eJRfndoV
Jq2IHjOdAkEAwFpOZR8j3Cl4zEk/9D9WEnSa8VWLe76vb7DfgfwkSAhs/f2MNF1I
zy9W5tPHRiMzaHNgPBFX9tw2u5QzsgOqHwJAPl3zUTjHZA41okoUIPVuNKsMzjE9
IH/wyuXq/ZwhBbHWpVTNYAbOtZlNvjh0HXZyDDzWTgTkQtKzK+J0H59XUQJARukD
vYOdVKx1O9pFGWW/9U3HUPCYWyYQxrwNqX2qYmO4ymmOJj+9d6OcBbxM2i5f5UGj
WIGMTBUimEQqSpXPQQJAIkHC2GknUv8HaBRLXxYTIAjj78a0pQT2bYlI6R04AwUZ
ljBaUGvvdYJ3CGZ32Xk12Te2fMJj5h/yLyEr8uzpzw==
-----END RSA PRIVATE KEY-----',
];
/**
* 构造函数
* Rsa constructor.
* @param $private_key_filepath
* @param $public_key_filepath
*/
public function __construct($private_key_filepath = null, $public_key_filepath = null)
{
if(!empty($private_key_filepath) && !empty($public_key_filepath)){
$this->_config['private_key'] = $this->_getContents($private_key_filepath);
$this->_config['public_key'] = $this->_getContents($public_key_filepath);
}
}
/**
* @uses 获取文件内容
* @param $file_path string
* @return bool|string
*/
private function _getContents($file_path)
{
file_exists($file_path) or die ('密钥或公钥的文件路径错误');
return file_get_contents($file_path);
}
/**
* @uses 获取私钥
* @return bool|resource
*/
private function _getPrivateKey()
{
$private_key = $this->_config['private_key'];
return openssl_pkey_get_private($private_key);
}
/**
* @uses 获取公钥
* @return bool|resource
*/
private function _getPublicKey()
{
$public_key = $this->_config['public_key'];
return openssl_pkey_get_public($public_key);
}
/**
* 私钥加密 (使用公钥解密)
* @param string $data
* @return null|string
*/
public function privateEncrypt($data = '', $padding = OPENSSL_PKCS1_PADDING)
{
if (!is_string($data)) return null;
$encrypted = '';
$chunks = str_split($data, 117);
foreach ($chunks as $chunk) {
$partialEncrypted = '';
$encryptionOk = openssl_private_encrypt($chunk, $partialEncrypted, $this->_getPrivateKey(), $padding);
if ($encryptionOk === false) {
return null;
}
$encrypted .= $partialEncrypted;
}
$encrypted = base64_encode($encrypted);
return $encrypted;
}
/**
* 公钥加密(使用私钥解密)
* @param string $data 加密字符串
* @param int $padding
* @return null|string
*/
public function publicEncrypt($data = '', $padding = OPENSSL_PKCS1_PADDING)
{
if (!is_string($data)) return null;
$encrypted = '';
$chunks = str_split($data, 117);
foreach ($chunks as $chunk) {
$partialEncrypted = '';
$encryptionOk = openssl_public_encrypt($chunk, $partialEncrypted, $this->_getPublicKey(), $padding);
if ($encryptionOk === false) {
return null;
}
$encrypted .= $partialEncrypted;
}
$encrypted = base64_encode($encrypted);
return $encrypted;
}
/**
* @uses 私钥解密 (使用公钥加密)
* @param string $encrypted
* @return null
*/
public function privateDecrypt($encrypted = '')
{
if (!is_string($encrypted)) return null;
$decrypted = '';
$chunks = str_split(base64_decode($encrypted), 128);
foreach ($chunks as $chunk) {
$partial = '';
$decryptIsTrue = openssl_private_decrypt($chunk, $partial, $this->_getPrivateKey());
if ($decryptIsTrue === false) {
return null;
}
$decrypted .= $partial;
}
return $decrypted;
}
/**
* 公钥解密 (使用私钥解密)
* @param string $encrypted 被解密字符串
* @return null
*/
public function publicDecrypt($encrypted = '')
{
if (!is_string($encrypted)) return null;
$decrypted = '';
$chunks = str_split(base64_decode($encrypted), 128);
foreach ($chunks as $chunk) {
$partial = '';
$decryptIsTrue = openssl_public_decrypt($chunk, $partial, $this->_getPublicKey());
if ($decryptIsTrue === false) {
return null;
}
$decrypted .= $partial;
}
return $decrypted;
}
/**
* 私钥验签
* @param $data string 验签内容
* @param $signature string 签名字符串
* @param int $signature_alg
* @return bool
*/
public function privateSign($data, $signature, $signature_alg = OPENSSL_ALGO_SHA1)
{
$result = openssl_sign($data, base64_decode($signature), $this->_getPrivateKey(), $signature_alg);
openssl_free_key($this->_getPrivateKey());
return $result === 1 ? true : false;
}
/**
* 公钥验签
* @param $data string 验签内容
* @param $signature string 签名字符串
* @param int $signature_alg
* @return bool
*/
public function publicSign($data, $signature, $signature_alg = OPENSSL_ALGO_SHA1)
{
$result = openssl_verify($data, base64_decode($signature), $this->_getPublicKey(), $signature_alg);
openssl_free_key($this->_getPublicKey());
return $result === 1 ? true : false;
}
}
```
> 使用案例
* 公钥加密、私钥解密
```
$rsa = new Rsa();
// 加密明文
$crypt_text = '公钥加密、私钥解密';
echo '加密明文:' . $crypt_text.PHP_EOL;
$public_encrypt_data = $rsa->publicEncrypt($crypt_text);
echo '公钥加密后数据:' . $public_encrypt_data.PHP_EOL; // 一直在变化
$private_decrypt_data = $rsa->privateDecrypt($public_encrypt_data);
echo '私钥解密数据: ' . $private_decrypt_data.PHP_EOL;
```
>加密明文:公钥加密、私钥解密
>>公钥加密后数据:QHdj15P6l1gJbjNlD7spKT7KjCJJ0Qg5c8JjLBAS9hvhkq8eRuaNY/dDrboD3t40NvyPI8SBFBkDTjJ5IDyqTTSfthUROvasMD7wCPRYGaOt5to+ygfvV5t4CyYQEvSSflqimWvffRs0L8fs3pqE2kLD/AHOC94+ZBNFfzTTtVA=
>>>私钥解密数据: 公钥加密、私钥解密
* 私钥加密、公钥解密
```
$rsa = new Rsa();
// 加密明文
$crypt_text = '私钥加密、公钥解密';
echo '加密明文:' . $crypt_text.PHP_EOL;
$private_encrypt_data = $rsa->privateEncrypt($crypt_text);
echo '私钥加密后数据:' . $private_encrypt_data..PHP_EOL; // 不变
$public_decrypt_data = $rsa->publicDecrypt($private_encrypt_data);
echo '公钥解密数据: ' . $public_decrypt_data..PHP_EOL;
```
> 加密明文:私钥加密、公钥解密
>>私钥加密后数据:dDzAs7kj9z7kS7Zbcz6sNLP+sIOnXp2qFGr4RepZcZp9XzCt8Tt+Kd/NIo4S20hjAvBiurvSHaR6LLL5ur5dc4vkFGkV+bGaT2SlhC4JkvYt4N2T9EiQupwcCtlk+dcENLexWiCvZtuzk3peK+H7AUWqFeOlmGRZb3De7bP+heY=
>>>公钥解密数据: 私钥加密、公钥解密
* 测试结果:`私钥加密`是不变的,`公钥加密`后的字符串一直是变化的
> 经历
二流院校,计算机工科男
> 常用ID
Tinywan
> 主页
[https://www.tinywan.com](https://www.tinywan.com/
)
> GitHub:
[https://github.com/Tinywan
](https://github.com/Tinywan
)
>博客园地址
[http://www.cnblogs.com/Tinywan](http://www.cnblogs.com/Tinywan)
- 序言
- 专题零 PHP基础
- 1、线程安全与非线程(NTS)安全版本的区别
- 2、JWT认证
- 3、数组
- 专题一 Nginx 实践教程
- 1、什么是Nginx?
- 2、Nginx 特性和编译安装
- 3、日志配置和模块讲解
- 4、静态资源和缓存服务
- 5、正向和反向服务
- 6、七层和四层负载均衡
- HTTP负载均衡(七层)
- TCP负载均衡(四层)
- 阿里云负载均衡配置
- 7、Rewrite规则
- 8、如何配置HTTPS服务
- 9、高级模块(RTMP)
- (1)nginx-vod-module 模块
- 10、Nginx与Lua开发(Openresty介绍)
- 11、性能优化和常见问题
- 12、什么Openresty以及Openresty扩展模块学习
- 13、实践案例
- (1)限流模块
- (2)详解:Nginx 反向代理、后端检测模块
- 14、如何做一个systemctl服务
- (1)Centos
- 15、agentzh 的 Nginx 教程
- 16、Openresty-Lua动态修改upstream后端服务
- 17、16点搞定高性能web服务器
- 18、如何配置proxy_cache模块
- 1、微信打开https页面显示空白解决记录
- 19、在线 Nginx 配置生成器
- 20、Nginx的负载均衡算法
- 1、加权轮询理论
- 专题二 流媒体系统
- 1、什么是视频直播?
- 2、如何使用推流软件OBS?
- 3、基于Nginx 的RTMP模块搭建系统
- 4、直播流程
- 5、典型业务场景
- 6、解决方案架构
- 7、编写Shell脚本上传直播回顾到阿里云OSS存储
- 8、直播回调授权观看
- 9、视频直播源如何加密
- 10、如何实现视频在线云剪辑
- 11、视频点播以及加密技术实现
- 12、FFmpeg使用
- 13、播放器
- 14、其他问题
- 15、HLS 直播加密播放
- 16、nginx-vod-module 模块
- 17、车辆维修直播系统
- 专题三 Redis 数据库
- 1、编译安装
- 2、配置详解
- 3、基础知识
- 4、Redis 执行Lua脚本基本用法
- 5、Redis 漏洞如何防止被黑客攻击
- 6、使用场景
- 7、如何在Ubuntu 16.04上安装和配置Redis
- 8、Redis实现分布式锁(集群版)
- 9、Redis键空间通知
- 1strace 调试
- 10、Redis5.0 搭建Cluster集群
- 1、创建和使用Redis群集
- 2、新增节点
- 11、基于Redis的限流器的实现
- 12、Redis5.0 新特性
- 1、新的Stream类型
- 附录一 常见问题
- 专题四 Shell 脚本
- 1、编写快速安全Bash脚本的建议
- 2、写好shell脚本的13个技巧
- 3、shell脚本实现分日志级别记录日志
- 4、Nginx日志定时备份和删除
- 5、SHELL脚本小技巧
- 6、Mysql 自动备份脚本安全加锁机制
- 7、PHP和Shell 脚本如何很好的搭配
- 8、Shell 脚本判断Redis键值是否是一个正整数
- 专题五 ThinkPHP5 框架
- 1、如何使用命令行(带参数)
- 2、如何使用多任务队列
- 3、缓存支持文件缓存和Redis缓存
- 4、通过redis实现session共享存储 (不需要修改php.ini配置文件)
- 5、符合REST架构设计的API,提供便利的API的版本号访问地址
- 6、引入Trait,实现了代码的复用
- 7、结合GatewayWorker实现简单的聊天功能
- 8、PHPExcel与ajax结合进行文件异步下载
- 9、phpspreadsheet 导出文件支持Excel、Csv、Html格式导出
- 10、读取 Excel 上传文件后批量导入MySQL数据库
- 11、支付宝沙箱模式支付(无需商户账号)
- 12、自定义日志(模块分类)和 socketlog-server服务
- 13、如何实现数据库自定义自增字段实现,方法
- 14、分布式之延时任务方案解析
- (1)生成订单60秒后,给用户发短信
- (2)延迟自动取消订单
- 15、Repository 模式实现业务逻辑和数据访问的分离
- 16、命令行守护进程
- 17、如何自定义异常类
- (1)Exception 类
- (2)系统异常处理
- (3)自定义异常类
- (4)自定义异常类处理类
- (6)全局异常类处理
- 18、阿里云专题
- (1)如何使用短信SDK
- (2)OSS扩展使用
- 19、命令行
- 20、容器专题
- 21、缓存
- (1)缓存自动更新
- 22、日志
- (1)错误日志邮件通知
- (2)日志参数介绍
- 23、经典案例
- 1、API开发实现自动校验参数
- 24、升级坑记录
- 25、生产环境部署
- 1、开启缓存
- 专题六 MySQL数据库
- 1、安装与配置
- 2、索引
- 3、字符集
- 4、导出导入数据
- 5、5.7版本兼容性
- 6、数据库自动备份
- 7、优化
- 8、数据库设计规范
- 附录一 常用语句
- 附录二 MySQL实战45讲
- 1、常用语解释
- 专题七 PHP异常处理
- 第一章 Exception
- 第二章 系统异常处理
- 第三章 自定义异常类
- 第四章 自定义异常类处理类
- 第五章 日志
- 第六章 全局异常类处理
- 专题八 常用整理
- 第一章、Linux 命令
- 第二章、Google 扩展
- 第三章、frp内网穿透
- 【进阶一】做成一个服务
- 【进阶二】代理一个Websocket 服务
- 【进阶三】代理N个Web服务
- 附录一 Docker-compose 配置
- 第四章、如何美化文档
- 第五章 如何提高访问github的速度
- 第六章 Vultr搭建SS教程
- 第七章 VS code 环境配置
- 第八章、Ngrok
- 第十章 PHP7新特性
- 第十一章 PPH编译安装
- 第十二章 使用systemd管理workerman
- 第十三章 yaconf
- 第十四章 Supervisor进程管理工具
- 第十五章 常用工具列表
- 1、免费IP地址库
- 第十六章 Ubuntu rc.local systemd设置
- 第十七章 技术人员扩展Web应用程序
- 附录一 、Highcharts Ajax异步加载
- 附录二 laydate详细示例
- 第十八章 Redis配置Cookie模拟session登录
- 专题九 PHP函数
- (1)系统函数
- (2)自定义函数
- (3)回调函数
- (4)匿名函数
- (5)递归函数
- (6)常用函数库
- (7)call_user_func函数
- 专题十 问题误区
- 1 - 跨域问题
- 2 - PHP 面试总结
- 3、PHP算法
- 4、MySQL基础知识
- 5、面试总结
- 6、empty、isset、is_null的用法和区别
- 7、PHP常用函数整理
- 8、Git 注意要点
- 1、git 解决每次更新代码都要输入用户名密码
- 2、git stash和git stash pop
- 3、分支(OEM管理)
- 4、推送本地分支到远程分支
- 5、Git分支模型
- 9、PHP常见误区
- 10、shell 脚本
- 11、Http 状态吗
- 12、日期、时间
- 13、it set 'X-Frame-Options' to 'DENY'
- 14、一次Redis内存占用很高
- 15、项目composer.lock 文件是否需要版本控制
- 专题十一 支付
- 一、return_url和notify_url的区别
- 二、汇付宝网关
- 三、PV、UV、IP 区别
- 四、支付结算周期
- 五、ngrok
- 六、转账
- 七、支付宝
- 1、当面付
- (1)条码支付和扫码支付介绍
- (2)接口申请
- (3)生成RSA密钥
- (4)SDK集成与密钥配置
- (5)扫码支付接入
- 2、常见错误信息
- 3、商家服务
- 4、企业支付
- 5、第三方应用
- 6、服务商接入
- 7、订单查询
- 8、新转账链接来生成收款码
- 9、银行卡转账
- 八、三方渠道
- 九、结算
- 十、在线支付平台的实现
- 1、支付平台的接入
- 2、支付请求、支付结果返回的传输安全
- 3、支付站点、商户站点、银行网关的交互
- 4、支付状态不同步的处理
- 5、支付方案
- (1)银行对接方案
- 十一、在线支付平台支付接口的设计
- 1、支付接口
- (1)支付请求参数
- (2)支付返回参数
- 2、退款接口
- 3、查询接口
- 遇到的坑
- 1、异步和主查询遇到的问题
- 2、一次没有记录的订单是如何代付成功的?
- 十二、个人免签支付
- 专题十二 安全
- 1、SQL注入
- 2、XSS攻击
- 3、会话固定
- 4、会议捕获和劫持
- 5、跨站点请求伪造(CSRF)
- 6、代码注入
- 7、RSA 加密解密
- 8、PHP处理密码的几种方式
- 9、安全建议
- 10、Shell脚本加密工具——Shc
- 12、DDos攻击
- 11、RSA 1024和AES 256
- (1)RSA加密传输代码示例
- (2) 支付Demo
- 附录一 一次阿里云被Doss
- 专题十三 消息中间件(MQ)
- 消息一、NSQ
- 消息二、分布式之消息队列
- 1、为什么要使用消息队列 ?
- 消息三、RabbitMQ
- 4、消息确认机制
- 1、 简单队列 hello world
- 专题十四 Docker
- 第一部分 Docker安装
- 第二部分 如何在本地构建镜像
- 第三部分 镜像、容器以及命令操作
- 1、进入容器的4种方式
- 第四部分 Dockerfile指令介绍
- 第五部分 发布自己的镜像
- 第六部分 数据卷管理
- 第七部分 Docker-compose
- 1、Docker-Compose入门基础
- 2、构建自己的docker-compose配置
- 第八部分 Docker网络
- 第九部分 搭建私有仓库
- 第十部分 Docker部署方式
- 第十一部分 Swarm集群
- 1、Swarm介绍
- 2、Swarm集群部署与管理
- 1、命令列表
- 2、创建集群
- 3、为swarm添加节点
- 3、集群服务管理
- 1、部署服务
- 2、检查服务
- 3、扩展服务
- 4、删除服务
- 5、更新服务
- 6、清空节点
- 4、管理应用程序数据(数据持久化)
- 5、集群服务发布
- 6、服务发现与负载均衡(上)
- 7、服务发现与负载均衡(下)
- 8、高可用架构
- 9、服务配置文件管理
- 10、集群部署LNMP网站平台实战
- 附录一 基础
- 附录二 常见错误问题
- 1、设置时区时间
- 附录三 阿里云部署记录
- 附录四 Ubuntu 18.04换国内源
- 附录五 常见文件精粹
- 附录六 Kong
- 附录七 PHPStrom 调试XDebug
- 附录八 Docker和PHP
- 附录九 安装RabbitMQ
- 1、使用场景
- 2、简单队列
- 3、交换机模式
- 4、插件安装
- 专题十五 Git版本管理
- 1、Git基础命令
- 2、团队Git 分支模型
- 3、缓存&撤销
- 4、储藏与清理
- 5、生成SSH公钥
- 6、配置 Git
- 附录一 常见误区
- 附录二、如何同步Fork
- 附录三 通过乌龟查看历史记录
- 附录四 多Git账户id_rsa私钥
- 专题十六 WorkerMan
- 1、Worker类的使用
- 2、AsyncTcpConnection类
- 3、SocketIO消息推送
- 4、ThinkPHP5.1使用
- 附录一 使用systemd管理workerman
- 专题十七 Jenkins
- 1、Jenkins安装
- 2、Pipeline插件
- 3、BlueOcean
- 附录一 常见错误
- 附录二 实战一
- 专题十八 测试专题
- API接口
- 第一章:如何调用API接口
- 第二章:如何创建推流地址
- 网络状态码大全
- 测试记录
- 笔记一:Nginx-Rtmp推流授权
- 笔记二:阿里直播推流笔记
- 笔记三:私有云直播推流笔记
- 笔记四:IM 测试记录
- 项目功能列表
- 功能一:生成短链接网址
- LiveVideoStack
- 音视频未来
- AV1
- JavaScript
- 基础知识
- Unix/C编程
- 1、基本概念
- 2、Unix套接字
- 二、Crontab
- 1、入门教程
- 2、crontab 解决周期内未执行完重复执行
- Golang
- 一、基础
- 二、命令行
- 自动部署持续集成
- 1、利用WebHook实现PHP自动部署Git代码
- 2、coding托管你的Gitbook
- 3、OneinStack
- 4、利用 GitHook 构建持续交付和部署
- 并发
- 第一章、订单并发处理
- 第二章、分布式锁
- 设计模式
- 第一章、依赖注入
- 第二章、策略模式
- 第三章、装饰器模式
- 第四章、Service模式
- 第五章、Repository模式
- 第六章、Presenter模式
- 创建设计模式
- 单例模式(Singleton)
- 工厂模式(Factory)
- 抽象工厂模式(AbstractFactory)
- 建造者模式(Builder)
- 原型模式(Prototype)
- 结构设计模式
- 适配器模式(Adapter)
- 桥接模式(Bridge)
- 合成模式(Composite)
- 装饰器模式(Decorator)
- 门面模式(Facade)
- 代理模式(Proxy)
- 享元模式(Flyweight)
- 常用
- 1、编辑器
- 2、编译安装
- 3、生成二维码(qr-code)
- 5、Mysql
- 4、Composer
- 6、看云美化CSS样式
- 7 office2019激活方法
- MVC
- 第一章、MVC 框架中的路由器(Router)是如何跑起来的?
- 专题十五 区块链
- 1、区块链到底长什么样?
- 面试招聘
- 专题十六 PHPstrom工具
- 附录一 采坑记录
- 1、 Redis错误 No space left on device
- 个人简历
- PHP高级实战
- 1、自动加载
- ThinkPHp3.2
- 1、四种URL_MODEL模式
- 沃土