【问题标题】:Encrypt & Decrypt String - PHP加密和解密字符串 - PHP
【发布时间】:2019-06-14 23:46:51
【问题描述】:

我有file1.php & file2.php,在file1.php 有一些链接,例如:

<a href="http://google.com/">Open google site</a>
<a href="http://facebook.com/">Open facebook site</a>

我尝试在file1.php 上进行安全链接,我正在使用此功能进行加密

function enc_safelink($url_target){
    $key = '1q2w3e4r5t'; 
    $iv = mcrypt_create_iv(
    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
    MCRYPT_DEV_URANDOM
    );

    $encrypted = base64_encode(
        $iv .
        mcrypt_encrypt(
            MCRYPT_RIJNDAEL_128,
            hash('sha256', $key, true),
            $url_target,
            MCRYPT_MODE_CBC,
            $iv
        )
    );
    return $encrypted;
}

所以file1.php 上的所有链接都是这样的:

<a href="file2.php?link=D6/thGZQ3MpUf6ePqqDBrXdQC3rAVQHMHGm9KOn6GVjB3CNyDqljwt7DIwkWU6HV">Open google site</a>
<a href="file2.php?link=HYOyBzxnpd1MrzN4YMF1qpWSg4KMlE1mz2HTxOl+ZGdS3zUSQymoMIPoBMVu3Mpm">Open facebook site</a>

file2.php我想显示一个链接并从参数中获取永久链接

 <?php
  function dnc_safelink($params_code){
    $key = '1q2w3e4r5t';
    $data = base64_decode($params_code);
    $iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));

    $decrypted = rtrim(
       mcrypt_decrypt(
       MCRYPT_RIJNDAEL_128,
       hash('sha256', $key, true),
       substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
       MCRYPT_MODE_CBC,
       $iv
    ),
    "\0"
    );
    return $decrypted;
  }
  if ( isset($_GET["link"]) ) :
    $dnc_url = dnc_safelink($_GET['link']);
    echo '<div style="text-align:center" id="aDivSafeLink"><a href="'.$dnc_url.'">Download Here</a></div>';
  endif;
 ?>

但是输出是这样的:

<a href="�uJ�`*���_����gyܥ�w�W�X�#">Download Here</a>

我确定,我已经在同一页面上测试过加密和解密功能可以完美运行。如何使用不同页面或不同站点的字符串加密和解密?

函数来源:https://stackoverflow.com/a/1289114

【问题讨论】:

  • 是什么阻止你只使用github.com/defuse/php-encryption
  • 你确定$params_code是解密时的完整链接吗?也许有些字符丢失了。提示:url-safe base64
  • @ArtjomB。哦,我知道了,谢谢你的提示;)
  • 如果你已经解决了这个问题,你应该写下你自己的答案并接受它。

标签: php encryption


【解决方案1】:

如何对不同页面或不同站点的字符串进行加密和解密?

如果您发现自己在加密 URL 参数,那么您就犯了一个错误。

人们想在这里做什么

人们应该做什么


random_bytes()bin2hex()base64_encode() 结合使用,而不是加密。如果您使用 Base64,请将生成的字节数设为 3 的偶数倍(例如,random_bytes(24) 用于 32 个字符的字符串)。

你也可以像这样使用URL-safe base64

<?php
use ParagonIE\ConstantTime\Base64UrlSafe;

$token = Base64UrlSafe::encode(random_bytes(24));

但加密只是the wrong tool for the job

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 2013-06-11
    • 2020-08-04
    • 2019-06-29
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多