加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

为什么PHP / MySQL会在一个特定的AES字符串解密时选择性地失败?

发布时间:2020-12-13 17:07:11 所属栏目:PHP教程 来源:网络整理
导读:我通过 PHP5中的PDO函数在MySQL表中存储一个敏感的16字符用户字符串.我有一对本机加密/解密功能如下: function encrypt($in){ $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size,MCRYPT_RAND); $enc =
我通过 PHP5中的PDO函数在MySQL表中存储一个敏感的16字符用户字符串.我有一对本机加密/解密功能如下:

function encrypt($in)
{

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size,MCRYPT_RAND);
    $enc = mcrypt_encrypt(MCRYPT_RIJNDAEL_256,ENCRYPT_KEY,$in,MCRYPT_MODE_ECB,$iv);

    return $enc;
}

function decrypt($in)
{

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,MCRYPT_RAND);
    $dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$iv);

    return $dec;
}

其中ENCRYPT_KEY是先前定义的全局常量.

我首先加密()字符串,然后将记录插入指定的表.我经常需要通过SELECT语句循环访问这些信息,然后解密()结果进行处理.

现在,除了一个以外的每个案例都会完美地发生

在选择/解密周期中,一个(并且仅)记录来自大约50个解密作为gobbledy-goop.我看不出encrypt()和decrypt()函数有什么问题,并且反复使用相同的结果插入有问题的记录.如下调用:

echo decrypt(encrypt($string));

工作良好.因此,我唯一想到的是MySQL无法正确存储此特定字符串的加密版本,但我不知道为什么.存储功能如下:

function update_sensitive_details($sensitive)
{
    $this->store_sensitive = encrypt($sensitive);

    try
    {
        $sql = "UPDATE table SET store_sensitive = ? WHERE (id = ?);";
        $sth = $this->registry->db->prepare($sql);
        $sth->execute(array($this->store_sensitive,$this->id));
    }
    catch (PDOException $p)
    {
        log_error($p);
        return false;
    }

    return true;
}

这不会导致任何错误,我可以确认这实际上确实用数据更新了表(尽管在加密时它在phpMyAdmin中查看时是不可理解的.

有没有人对这里可能发生的事情有任何想法?我很难过.我唯一能想到的是MySQL没有正确存储特定的加密字符串,因为即使更改16个字符中的一个也能解决问题.我原以为PDO会阻止这种情况,但也许不会.

解决方法

尝试使用base64_encode()包装加密数据,然后在解密之前使用base64_decode().我在某些情况下在MySQL中有数据损坏,这一直是修复它.

function encrypt($in)
{

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,$iv);
    $enc = base64_encode($enc);
    return $enc;
}

function decrypt($in)
{
    $in = base64_decode($in);
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,$iv);

    return $dec;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读