5

curl 参数加解密方案

 2 years ago
source link: https://walkerdi.github.io/2019/04/05/curl-encryption/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

curl 参数加解密方案

在web 应用开发中,我们通常会对一些敏感参数进行加密,来提高安全性,这里提供了一种在curl 中加密和解密的实现方案,可以自定义密匙和有效期。具体实现代码如下:


/**
 * Description: encode.php
 * @Author: WalkerDi
 * @param $string 明文 或 密文
 * @param string $operation  DECODE表示解密,其它表示加密
 * @param string $key 密匙
 * @param int $expiry 密文有效期
 */

function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
    $ckey_length = 4;

    // 密匙
    $key = md5($key);

    // 密匙a会参与加解密
    $keya = md5(substr($key, 0, 16));
    // 密匙b会用来做数据完整性验证
    $keyb = md5(substr($key, 16, 16));
    // 密匙c用于变化生成的密文
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
    // 参与运算的密匙
    $cryptkey = $keya.md5($keya.$keyc);
    $key_length = strlen($cryptkey);
    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
    $string_length = strlen($string);
    $result = '';
    $box = range(0, 255);
    $rndkey = array();
    // 产生密匙簿
    for($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    }
    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
    for($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    // 核心加解密部分
    for($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        // 从密匙簿得出密匙进行异或,再转成字符
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if($operation == 'DECODE') {
        // substr($result, 0, 10) == 0 验证数据有效性
        // substr($result, 0, 10) - time() > 0 验证数据有效性
        // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
        // 验证数据有效性,请看未加密明文的格式
        if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    } else {
        // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
        // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
        return $keyc.str_replace('=', '', base64_encode($result));
    }
}


$str = "ABC";
$encodeStr = authcode($str, 'ENCODE', 'abc@#$123');

echo "加密: ".$encodeStr."\n";
echo "解密: ".authcode($encodeStr, 'DECODE', 'abc@#$123');


Recommend

  • 84
    • Github github.com 6 years ago
    • Cache

    GitHub - rs/curl-httpie: HTTPie for curl

    README.md HTTPie for curl If you like the interface of HTTPie but miss the features of curl, curl-httpie is what you are sear...

  • 83
    • www.tuicool.com 6 years ago
    • Cache

    Weather reports with curl

    What is curl? curl is a program that is included in your Mac OSX distribution used for transferring data from or to a server. It uses many supported protocols (HTTP, HTTPS, FTP, SMTP and more).

  • 52
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    apt,curl,openssl之间的那点事

  • 74
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    apt, curl, openssl 之间的那点事

    扫描关注公众号(yudadanwx,虞大胆的叽叽喳喳),了解我的最新文章。 Curl 可以说是非常流行的一个客户端网络请求工具,充分理解了 C...

  • 93
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    yum,curl,nss之间的那点事

  • 9
    • 微信 mp.weixin.qq.com 3 years ago
    • Cache

    Rax 小程序运行时方案解密与思考

    2020 年 3 月,暨支持编译时方案之后,Rax 小程序发布了支持运行时方案的版本。截至目前,Rax 仍是业界唯一一个同时支持编译时和运行时方...

  • 6

    骁龙XR 2平台+全新6DoF追踪方案,Pico Neo 3硬件参数大公开_VR陀螺 骁龙XR 2平台+全新6DoF追踪方案,Pico Neo 3硬件参数大公开 发布时间:2021-04-13 11:55  |  标签:

  • 5

    LINUX下循环读取文件参数并CURL远程API 一系列参数存于文本文件,需在LINUX下循环读取,之后以此参数进行CURL远程API调用,同时需记录每次CURL的总时间

  • 3
    • blog.51cto.com 2 years ago
    • Cache

    curl常用参数详解及示例

    curl简介 curl是一个开源的命令行工具,它基于网络协议,对指定URL进行网络传输,得到数据后不任何具体处理(如:html的渲染等),直接显示在"标准输出"(stdout)上。 curl支持的网络协议有很多,包括:DICT、FILE、FTP、FTPS、GOPHER、GOP...

  • 7

    话接上文的指令微调的样本优化方案,上一章是通过多样性筛选和质量过滤,对样本量进行缩减,主打经济实惠。这一章是通过扩写,改写,以及回译等半监督样本挖掘方案对种子样本进行扩充,提高种子指令样本的多样性和复杂度,这里我们分别介绍Microsoft,Meta和IBM提出...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK