如何正确地使用加密与认证技术(2)
0x02 加密
我们之前定义了加密,并且详细说明了它是提供机密性,但不提供完整性和真实性的。你可以篡改加密信息,并将产生的垃圾给予接收者。而且你甚至可以利用这种垃圾产生机制,来绕过安全控制。
考虑在加密cookie的情况下,有如下代码:
function setUnsafeCookie($name, $cookieData, $key)
{
$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
return setcookie(
$name,
base64_encode(
$iv.
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$key,
json_encode($cookieData),
MCRYPT_MODE_CBC,
$iv
)
)
);
}
function getUnsafeCookie($name, $key)
{
if (!isset($_COOKIE[$name])) {
return null;
}
$decoded = base64_decode($_COOKIE[$name]);
$iv = mb_substr($decoded, 0, 16, '8bit');
$ciphertext = mb_substr($decoded, 16, null, '8bit');
$decrypted = rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$key,
$ciphertext,
MCRYPT_MODE_CBC,
$iv
),
"
如何正确地使用加密与认证技术(2)
0x02 加密
我们之前定义了加密,并且详细说明了它是提供机密性,但不提供完整性和真实性的。你可以篡改加密信息,并将产生的垃圾给予接收者。而且你甚至可以利用这种垃圾产生机制,来绕过安全控制。
考虑在加密cookie的情况下,有如下代码:
function setUnsafeCookie($name, $cookieData, $key)
{
$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
return setcookie(
$name,
base64_encode(
$iv.
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$key,
json_encode($cookieData),
MCRYPT_MODE_CBC,
$iv
)
)
);
}
function getUnsafeCookie($name, $key)
{
if (!isset($_COOKIE[$name])) {
return null;
}
$decoded = base64_decode($_COOKIE[$name]);
$iv = mb_substr($decoded, 0, 16, '8bit');
$ciphertext = mb_substr($decoded, 16, null, '8bit');
$decrypted = rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$key,
$ciphertext,
MCRYPT_MODE_CBC,
$iv
),
"
);
return json_decode($decrypted, true);
}
上面的代码提供了在密码段链接模块的AES加密,如果你传入32字节的字符串作为$key,你甚至可以声称,为你的cookie提供了256位的AES加密,然后人们可能被误导相信它是安全的。