高校|密码算法靠数学提高安全性( 三 )


关于密文的破解有多种分类 , 其中最为普遍的划分方法是 , 按照攻击者获取的信息多少进行划分 。 在唯密文攻击中 , 攻击者的已知信息只有密文;在已知明文攻击中 , 攻击者的已知信息包括多个明文、密文对;在选择明文攻击中 , 攻击者可以自选任意明文 , 并获得相应的密文;在选择密文攻击中 , 攻击者可以选择任意密文 , 并获得相应明文 。
另外一种破解分类 , 是按照信息来源进行分类的 , 像我们提到的 4 种攻击方式以及密码算法层的分析都被归类为主信道攻击;与之相对的是侧信道攻击 , 这种攻击方式重点关注加密设备在执行过程暴露的信息 , 比如通过分析加解密时间、错误码等来进行破解 。
工程实践中的密码安全风险除了数学理论层面的安全性风险之外 , 在工程实践中我们也会遇到许多密码学相关的安全风险 , 接下来就带你了解有哪些典型的风险场景 。
硬编码密钥
在一些应用系统中 , 开发者可能会为了方便将加密密钥硬编码在源码中 , 在这种情况下 , 一旦应用系统被入侵 , 攻击者将可以轻松获得密钥 , 从而为后续入侵、提权、持久化埋下伏笔 。
int verifyAdmin( char *password)
{
if( strcmp(password \"68af404b513073584c4b6f22b6c63e6b\") )
{
printf(\"Incorrect Password!\\");
return(0);

return(1);

随机值重用
很多密码算法在应用过程中 , 会涉及到随机值的使用 。 在一些开发场景中 , 开发者将随机值固定为某一数值 , 使得随机值发生重用 , 这样可能会导致身份伪装等中间人攻击行为的发生 。
void encryptAndSendPassword( char *password)
{
char *tmp = \"bad\";
...
char *data = https://mparticle.uc.cn/api/(unsigned char*)malloc(20);
int para_size = strlen(tmp) + strlen(password);
char *paragraph = (char*)malloc(para_size);
SHA1((const unsigned char*)paragraph para_size (unsigned char*)data);
...

不安全的加密算法
在开发过程中使用不安全的加密算法 , 可能会导致敏感信息的泄露 , 同时这会给攻击者更多攻击的机会 , 因为如果一个加密算法存在安全缺陷 , 那么对它的攻击方式很可能已经广为人知了 。
也许你会好奇 , 是谁设计了不安全的加密算法呢?加密算法从诞生到应用 , 一定是经过了广泛实践检验的 。 但是由于近些年科技高速发展 , 无论是从理论算法层面发现了加密算法的缺陷 , 还是从算力增长的角度发现了某种现实性攻击 , 都使得加密算法的更新速度大幅提高 , 那些曾经被验证是安全的加密算法现如今也就变得不再安全了 。
如下代码示例使用了 DES 加密算法 , 考虑到目前 DES 已经被认为是不安全的 , 因此这段代码的安全性存在缺陷 , 在实际应用中目前普遍采用 AES 作为替代方案 。
function encryptPassword( $password )
{
$iv_size = mcrypt_get_iv_size(MCRYPT_DS MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size MCRYPT_RAND);
$key = \"This is a password encryption key\";
$encrypted_password = mcrypt_encrypt(MCRYPT_DES $key $password MCRYPT_MODE_ECB $iv);
...

可预测的初始化向量(Initialization Vector IV)
许多加密算法会使用初始化向量来强化安全性 , 以 DES 加密算法为例 , 其加密模式分为多种 , 其中 CBC 模式就与初始化向量相关 。 在设置初始化向量的过程中 , 如果初始化向量可以被预测 , 那么算法的安全性就会降低 。
这里我们仍然以 DES 算法的 CBC 模式为例 , 来分析初始化向量对于加密算法安全性的影响 。
在了解 CBC 模式前 , 你需要先了解 ECB 模式 , 这是最简单的块密码加密模式 , 全称是电子密码本(Eclectronic codebook)模式 , ECB 模式在加密前根据块的大小将明文分为若干块 , 之后每块使用相同的密钥单独加密 , 解密同理 。

推荐阅读