一、加密算法

1、散列加密(不可逆,md5、sha1、sha256)

1.1 md5 (长度16或32字节)
  $str = '203fpidf02lvj!!_@#_!';$md5_16 = md5($str,true); // 二进制字符echo $md5_16.'<br>';$md5_32 = md5($str);echo $md5_32.PHP_EOL;

结果:

1.2 sha1 (长度40字节)
     $str = '203fpid';$sha1 = sha1($str);echo $sha1.'<br>';

结果:

1.3 sha256 (长度64)
$str = '203fpidf02lvj!!_@#_!';$sha256 = hash('sha256',$str);echo $sha256.'<br>';

结果:

1.4 带秘钥的sha256 (长度64)
$str = '203fpidf02lvj!!_@#_!';$sha256 = hash_hmac('sha256',$str,'kjqfiuh');echo $sha256.'<br>';

2、非对称加密(可逆,DES、3DES、AES)

2.1 AES
 function randstr($length) {$char_set = array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9'));shuffle($char_set);return implode('', array_slice($char_set, 0, $length));}$plaintext = "message to be encrypted";$cipher = "aes-128-cbc";$key = randstr(16);$ivlen = openssl_cipher_iv_length($cipher);$iv = openssl_random_pseudo_bytes($ivlen);$ciphertext = openssl_encrypt($plaintext, $cipher, $key, 0, $iv);echo $ciphertext.'<br>';$decrypt = openssl_decrypt($ciphertext,$cipher,$key,0,$iv);echo $iv.'<br>';echo $tag.'<br>';echo $decrypt;

结果:

2.2 DES

function randstr($length) {

        $char_set = array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9'));shuffle($char_set);return implode('', array_slice($char_set, 0, $length));}$plaintext = "message to be encrypted";$cipher = "DES-CBC";$key = randstr(16);$ivlen = openssl_cipher_iv_length($cipher);$iv = openssl_random_pseudo_bytes($ivlen);$ciphertext = openssl_encrypt($plaintext, $cipher, $key, 0, $iv);echo $ciphertext.'<br>';$decrypt = openssl_decrypt($ciphertext,$cipher,$key,0,$iv);echo $iv.'<br>';echo $decrypt;

2.3 3DES
function randstr($length) {$char_set = array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9'));shuffle($char_set);return implode('', array_slice($char_set, 0, $length));}$plaintext = "message to be encrypted";$cipher = "des-ede3-cbc";$key = randstr(16);$ivlen = openssl_cipher_iv_length($cipher);$iv = openssl_random_pseudo_bytes($ivlen);$ciphertext = openssl_encrypt($plaintext, $cipher, $key, 0, $iv);echo $ciphertext.'<br>';$decrypt = openssl_decrypt($ciphertext,$cipher,$key,0,$iv);echo $iv.'<br>';echo $decrypt;

结果:

3、对称加密(可逆,RSA、DSA)

3.1 RSA
3.1.1 openssl生成密钥对
openssl genrsa -out private_key.pem 2048 // 私钥
openssl rsa -in private_key.pem -pubout -out public_key.pem // 公钥3.1.2 加解密
// 私钥文件,如果在文件中的可以通过file_get_contents获取
$private = '-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAwcyzxL6GGMavrQBlH89Czvq16n8VukM53wb3+LHV6tBTbJTy(略)
-----END RSA PRIVATE KEY-----';// 公钥文件,如果在文件中的可以通过file_get_contents获取
$public = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwcyzxL6GGMavrQBlH89C(略)
-----END PUBLIC KEY-----';// 根据私钥文件获取私钥
$privateKey = openssl_pkey_get_private($private);// 根据公钥文件获取公钥
$publicKey = openssl_pkey_get_public($public); // 原始数据
$content = ['name'=>'张三','age'=>18];// 私钥加密
openssl_private_encrypt(json_encode($content),$encrypted,$privateKey);// 非必须,可以通过base64_encode编码二进制字符串
$encrypted = base64_encode($encrypted);// 非必须,可以通过base64_decode解码二进制字符串
$decrypted = base64_decode($encrypted );// 公钥解密
openssl_public_decrypt($encrypted,$decrypted,$publicKey);// 打印结果
print_r(json_decode($decrypted,true));

结果:

3.2 DSA

DSA常用于签名,没有找到php版本代码

二、接口安全技术

1、token

// 加密
$sign = md5(md5( 用户id + 时间戳 + 随机字符串) + $secretKey) // secret 保证的算法的安全性
$auth_token = base64_encode(用户id + 时间戳 + 随机字符串 + $sign);

// 解密
通过验证 md5(md5(用户id + 时间戳 + 随机字符串 + $secretKey)) == $sign 验证签名是否正确,
时间戳可以用来验证时效性

2、code实现接口只能访问一次

$code = md5(时间戳 + substr(uniqid(),7) + 随机字符串);存储在redis中,设置有效期(比如5分钟),使用后删除,实现单次访问

3、接口IP限流 (1分钟不能超过10次)

redis设置一个key :接口名+ip => 访问次数 设置有效期1分钟,1分钟后消失,每次ip访问接口,次数+1,如果总次数>10,报出异常

4、JWT

// 随机字符串(以为uniqid生成的唯一id基于微妙,有存在重复的可能性,增加随机字符串保证最后的唯一字符串的唯一性)
function randstr($len)
{$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';return substr(str_shuffle($str),0,$len);
}// 生成随机字符串
$randstr = randstr(6);// 签名密钥(盐)
$secret = 'school';$header = ['type' => 'jwt','alg' => 'sha256'
];$payload = ['iss' => 'school', // jwt发布者'sub' => 'school', // jwt订阅者'aud' => '1001', // jwt用户'exp' => '1641784631', // jwt有效期截至时间戳'nbf' => '1641179831', // jwt有效期开始时间戳'iat' => '1641266232', // jwt发布时间戳'jti' => md5(time() . uniqid() . $randstr) // 唯一字符串,可用于不允许重复请求的情况
];$header_encode = base64_encode(json_encode($header));
$payload_encode = base64_encode(json_encode($payload));
$sign = hash_hmac('sha256',$header_encode . $payload_encode . $secret,'');
$token = $header_encode.'.'. $payload_encode .'.'. $sign;
echo $token.PHP_EOL;
// 验证签名
$arr_token = explode('.',$token);if (hash_hmac('sha256',$arr_token [0] . $arr_token [1] . $secret,'') == $arr[2]) {echo '签名正确';
} else {echo '签名错误';
}
// 结果
eyJ0eXBlIjoiand0IiwiYWxnIjoic2hhMjU2In0=.eyJpc3MiOiJzY2hvb2wiLCJzdWIiOiJzY2hvb2wiLCJhdWQiOiIxMDAxIiwiZXhwIjoiMTY0MTc4NDYzMSIsIm5iZiI6IjE2NDExNzk4MzEiLCJpYXQiOiIxNjQxMjY2MjMyIiwiand0aSI6ImMyZmExZTM2NmM1MzQ3NTg4Y2JmZWUzMzVkMWU2MmNkIn0=.04127dcff6623c843fd26b8ef1623dde3e7416f2c9052614d405f1fd7460b213
签名正确

php 加密算法+接口安全技术相关推荐

  1. linux内核支持的加密算法,Linux Kernel(Android) 加密算法总结(三)-应用程序调用内核加密算法接口...

    本文将主要介绍,如何在应用程序空间中(user space) 调用内核空间(kernel space)加密模块提供的加密算法API. 方法一:通过调用crypto: af_alg - User-spa ...

  2. 怎么开发一个完整的对外接口API

    1.客户端请求加密.服务端请求解密 2.防止重复提交 一般是在数据库加状态,在 status=0 的状态下更新,更新完状态变为1,这样就可以防止重复提交 ----------------------- ...

  3. 保护数据安全的三种武器

    随着信息化进程发展,各种信息化技术和系统的广泛应用,数据的数量成几何级增长,现阶段信息安全的重心,不再局限于系统本身的安全,而应该更多地关注数据的安全.数据安全不是一个新鲜的话题.从早期的防止DDOS ...

  4. python的md5

    Python之Md5()使用 Md5() 功能:MD5签名是一个哈希函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示):可用于文件命名 传入参数:bytes类型 导入:fr ...

  5. 探讨NET Core数据进行3DES加密或解密弱密钥问题

    [导读]之前写过一篇<探讨.NET Core数据进行3DES加密和解密问题>,最近看到有人提出弱密钥问题,换个强密钥不就完了吗,猜测可能是与第三方对接导致很无奈不能更换密钥,所以产生本文解 ...

  6. 使用 freeradius 搭建 EAP PEAP MS-CHAPv2 验证环境

    企业级 Wi-Fi 搭建起来有点小复杂,我们知道自己家使用的 Wi-Fi 非常简单,几乎只需要配置一下热点的 SSID 和密码就可以了,实际上这是两种 Wi-Fi 认证类型.想要快速部署企业级 Wi- ...

  7. linux命令行连接wifi RTL810xE PCI Express Fast Ethernet Controller 网卡

    linux命令行连接wifi - hunters007 - 博客园 https://www.cnblogs.com/hunter-007/p/11151092.html hunters007 linu ...

  8. CTF-show-爆破

    WEB入门-爆破 1.web21 2.web22 3.web23 4.web24 5.web25 6.web26 7.web27 8.web28 1.web21 tomcat认证爆破–用户名:密码,一 ...

  9. 《全民挂机》 源码解析 一

    源码来自9miao 本人技术有限,大家共同学习,抛砖引玉,加群讨论 交流群: 422209275 2.140.0版本的全民挂机 概述: 基本目录结构: Code_Client  (客户端 具体游戏相关 ...

  10. python-10-包和模块的概念

    目录 01-高阶函数 02-函数的嵌套 03-闭包的概念 04-计算一段代码的执行时间 05-优化计算时间的代码 06-装饰器的使用 Python 函数装饰器 07-装饰器详解 08-装饰器的使用 0 ...

最新文章

  1. c打开指定路径文件_C++ 读取指定路径下所有的文件 (C++ get the list of files in a directory)...
  2. mqtt消息推送 java_MQTT+ActiveMQ实现消息推送(服务器端java实现)
  3. myBatis抛出异常Result Maps collection already contains value ...
  4. 屏幕适配 部分知识点总结,CSDN小冰原创
  5. HTML常见标签总结
  6. 第三部分 Calendar函数接口
  7. java NIO网络编程之SelectionKey
  8. Oracle11g 配置 ST_GEOMETRY
  9. latex中怎么设置每一行文字都对齐_排版系列教程 | LaTeX,为学术论文排版而生【浮动体篇】...
  10. kali linux无法启动服务,不好了!出问题了!在安装Kali Linux之后启动系统时
  11. KDD China技术峰会回顾:大牛云集,教你如何基于大数据 手握人工智能未来
  12. python命令行安装pandas_python中安装pandas
  13. 数据库系统原理课程设计
  14. fckeditor java_FCKeditor.Java 源代码下载
  15. QT-C++ 注册机软件,生成机器码和注册码,支持授权时间
  16. 【韩语图片文字识别】如何快速识别韩语图片文字,将文字变成电子档,进行翻译处理教程
  17. COOC9.94一款用于文献计量和知识图谱绘制的软件
  18. git学习(一)初始化
  19. [转]技术经纪人将成职业新宠
  20. php ci cors,javascript-CORS请求在Safari中不起作用

热门文章

  1. 如何使用cygwin在windows下Linux编程
  2. 案例-做一个30分钟倒计时
  3. 显卡的优化以提高计算机性能作用,显卡优化,详细教您如何设置NVIDIA(英伟达)显卡玩游戏性能更高...
  4. manjaro kde 20.2安装
  5. python url加密解密_python解密百度加密链接的脚本
  6. Swiper(介绍、官网链接、引入链接、使用方式,滑动样式属性含义、查找滑动效果、动态Swiper、Vue-CLI引入)
  7. Leetcode 312 打气球 Burst Balloons C++ 史上最详细题解系列
  8. Account-login
  9. 使用cloudFlare实现动态DNS解析
  10. mysql 统计七日留存率_用户七日留存率分析