为什么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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |