如何正确地使用加密与认证技术(4)
0x04 认证
学习啦在线学习网 如上所述,认证旨在提供信息的完整性(我们指显著抗篡改能力),而这证明它来自预期的源(真实性)。这样做的典型方法是,为信息计算一个密钥散列消息认证码(HMAC的简称),并将信息与它连结。
function hmac_sign($message, $key)
{
学习啦在线学习网 return hash_hmac('sha256', $message, $key) . $message;
}
function hmac_verify($bundle, $key)
{
$msgMAC = mb_substr($bundle, 0, 64, '8bit');
$message = mb_substr($bundle, 64, null, '8bit');
return hash_equals(
学习啦在线学习网 hash_hmac('sha256', $message, $key),
$msgMAC
);
}
学习啦在线学习网 重要的是,这里使用一个适当的哈希工具,如HMAC,而不仅仅是一个简单的散列函数。
function unsafe_hash_sign($message, $key)
{
return md5($key.$message) . $message;
}
function unsafe_hash_verify($bundle, $key)
{
学习啦在线学习网 $msgHash = mb_substr($bundle, 0, 64, '8bit');
$message = mb_substr($bundle, 64, null, '8bit');
学习啦在线学习网 return md5($key.$message) == $msgHash;
}
我在这两个函数名前面加了unsafe,是因为它们还是易受到一些缺点的危害:
Timing Attacks
Chosen Prefix Attacks on MD5 (PDF)
学习啦在线学习网 Non-strict equality operator bugs (largely specific to PHP)
现在,我们有点接近我们强大的对称加密认证的目标。目前仍有几个问题,如:
学习啦在线学习网 如果我们的原始信息以空字节结尾会发生什么?
有没有一个比mcrypt扩展库默认使用的更好的填充策略?
学习啦在线学习网 由于使用AES,有哪些通信方面是易受攻击的?
幸运的是,这些问题在现有的加密函数库中已有了解答。我们强烈推荐你使用现有的库,而不是写自己的加密功能。对于PHP开发人员来说,你应该使用defuse/php-encryption(或者libsodium)。