所以我使用这个类来加密或解密数据:
class CryptData
{
private $hash;
function __construct($hash) {
$key = md5($hash, true);
$key .= substr($key, 0, 8);
$this->hash = $key;
}
public function Encrypt($data)
{
$encData = openssl_encrypt($data, 'DES-EDE3', $this->hash, OPENSSL_RAW_DATA);
return base64_encode($encData);
}
public function Decrypt($data)
{
$data = base64_decode($data);
return openssl_decrypt($data, 'DES-EDE3', $this->hash, OPENSSL_RAW_DATA);
}
}
它工作正常,但例如,如果我使用:
hash = 12345
text = 1234567891234567
并加密然后结果
decData = LQ1zff + UiAAs6GXEgA5x6beMPOubhpcA
现在,如果我尝试将此数据解密回纯文本,那么它会给我正确的结果,但即使我在decData的末尾添加任何字符,如
decData = LQ1zff + UiAAs6GXEgA5x6beMPOubhpcAa
令人惊讶的是它也提供了正确的纯文本.. !! 经过几次测试后我注意到了,没有' ='最后,如果我添加一个字符,那么它将解密为文本而不会出错。 例如,如果我尝试
hash = 12345
text = 12345
然后它将导致
decData = CQm / ZBYSrrs =
现在,如果我解密这个,最后添加一个字符,那么这将是一个错误。
总而言之,当我尝试加密长度= 16或更长的文本时,那么没有' ='在解密的数据中。我没有遇到任何问题,但如果我尝试解密解密数据,最后添加任何字符,它会给我正确的文本。
为什么这可能,这个问题对我的数据有任何安全问题吗?
答案 0 :(得分:1)
Base64 用于将二进制数据编码为文本,其中每个 Base64 字符代表6位。每3个字节(24位)的输入提供4个 Base64 字符。如果输入长度不是3的多个,则Base64的最后一个块用一个或两个'='填充
Base64 编码数据需要包含4个 Base64 字符,才能生效 Base64 。似乎php的echo strlen(base64_decode("LQ1zff+UiAAs6GXEgA5x6beMPOubhpcA"));
echo "\n";
echo strlen(base64_decode("LQ1zff+UiAAs6GXEgA5x6beMPOubhpcAa"));
只是忽略了你最后一个无效的 Base64 字符。您可以使用以下代码查看此内容:
24
24
,并提供:
matrix with image