• 原创
  • 后端开发
  • edauth高效可逆随机加密解密函数

    2020.02.19 16:06发布

    5865人阅读

    0人评论

    edauth高效可逆随机加密函数,性能比Discuz的authcode函数更优化,响应更快
    在项目配置文件中定议 'AUTH_KEY'=>'你的密匙字符串'


    // edauth高效可逆随机加密函数参数解释 
    // author: PGCao(排骨曹)
    #------------------------------------------------------------------------#
    # $string: 明文 或 密文
    # $operation:true表示加密,false表示解密
    # $key: 密匙
    # $outtime:密文有效期, 单位为秒
    # $entype:加密方式 有md5和sha1两种 加密解密需要统一使用同一种方式才能正确还原明文
    function edauth($string, $operation = true, $key = '', $outtime = 0, $entype = 'md5'){
    $key_length = 4;
    if($entype == 'md5'){ //使用md5方式
    $long_len = 32; $half_len = 16; $entype == 'md5';
    }else{ //使用sha1方式
    $long_len = 40; $half_len = 20; $entype == 'sha1';
    }
    $key = $key != '' ? $key : substr(md5($_SERVER['DOCUMENT_ROOT'].$_SERVER['REMOTE_ADDR']),0,30);
    $fixedKey = hash($entype, $key);
    $egiskeys = md5(substr($fixedKey, $half_len, $half_len));
    $runtoKey = $key_length ? ($operation ? substr(hash($entype, microtime(true)), -$key_length) : substr($string, 0, $key_length)) : '';
    $keys = hash($entype, substr($runtoKey, 0, $half_len) . substr($fixedKey, 0, $half_len) . substr($runtoKey, $half_len) . substr($fixedKey, $half_len));
    $string = $operation ? sprintf('%010d', $outtime ? $outtime + time() : 0).substr(md5($string.$egiskeys), 0, $half_len) . $string : base64_decode(substr($string, $key_length));
    $i = 0; $result = '';
    $string_length = strlen($string);
    for ($i = 0; $i < $string_length; $i++){
    $result .= chr(ord($string{$i}) ^ ord($keys{$i % $long_len}));
    }
    if($operation){
    return $runtoKey . str_replace('=', '', base64_encode($result));
    }else{
    if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, $half_len) == substr(md5(substr($result, $half_len+10).$egiskeys), 0, $half_len)) {
    return substr($result, $half_len+10);
    } else {
    return '';
    }
    }
    }

    以下是测速代码,有兴趣的PR可以试用authcode函数进行比较,同一页面用得越多越能体现出前后性能区别


    <?php
    //测试处理速度
    echo "<h3>edauth函数</h3>";
    $_runtime_ = microtime(true);
    $str = "生产不同密文后能解密!^_^ ";
    //for($i=0;$i<500;$i++)$str .= "同样的明文,生产不同密文后能解密!^_^ ";
    //$str .= "OK";
    $key = "12***89";
    echo "<b>明文:</b>".$str."<hr />";
    echo "<b>密文:</b>".$out = edauth($str, true, $key);
    echo "<hr /><b>原文:</b>".edauth($out, false, $key);
    echo "<hr /><b>明文:</b>".$str."<hr />";
    echo "<b>密文:</b>".$out = edauth($str, true, $key);
    echo "<hr /><b>原文:</b>".edauth($out, false, $key);
    $runtime = number_format((microtime(true) - $_runtime_), 6);
    echo '<hr />Runtime '. $runtime .' second(s)';
    ?>

     

    举报文章

  • 收藏博客:

  • 分享至:
  • 添加评论

    请先登录再评论...

    登录

    评论列表(条评论)

    没有更多评论了