实现安全的strcmp函数:secure_strcmp
最近看到一个题,题目大概意思是这样的,在不考虑外界因素的条件下,strcmp函数在比较相同长度相同内容的执行时间是相同的,但是同等长度不同内容的比较所花的时间有可能不一样,这可能会成为安全攻击的切入点。要求我们实现安全的strcmp函数,保证每次比较相同长度不同内容字符串时所花的时间是相同的。

下面谈谈我的见解,我是这样想的,既然比较花的时间不一样,那可能是考虑到性能,没有做完全的比较(惭愧,没看过strcmp源码),发现存在不同字符就返回比较结果。

所以要实现安全的strcmp函数,我们很容易想到的是做完全比较。如下实现:
int secure_strcmp(const char *src, char *dest){
    int i, temp1 = 0, temp2 = 0;
    int srcLen = strlen(src);
    int destLen = strlen(dest);
    //分别计算每个字符串ASCII值
    for(i = 0; i < srcLen; i++){
        temp1 += (int)(*src++);
    }
    for(i = 0; i < destLen; i++){
        temp2 += (int)(*dest++);
    }
    //返回ASCII值的差
    return temp1 - temp2;
}

当然,这个函数还能做一下优化,如果不关心返回的数是多少,只关心是否相等,那么在考虑安全的同时可以这样改写:
int secure_strcmp_new(const char *src, char *dest){
    int i, temp1 = 0, temp2 = 0;
    int srcLen = strlen(src);
    int destLen = strlen(dest);
    //长度不相等,则返回长度差
    if(srcLen != destLen){
        return srcLen - destLen;
    }

    //分别计算每个字符串ASCII值
    for(i = 0; i < srcLen; i++){
        temp1 += (int)(*src++);
    }
    for(i = 0; i < destLen; i++){
        temp2 += (int)(*dest++);
    }
    //返回ASCII值的差
    return temp1 - temp2;
}
这样,只有待比较字符串和目标字符串长度相同时才做完全比较。

下面进行简单测试:
#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    printf("%d\n", secure_strcmp("hello", "world"));
    printf("%d\n", secure_strcmp("world", "hello"));
    printf("%d\n", secure_strcmp_new("ello", "world"));
    printf("%d\n", secure_strcmp_new("world", "ello"));
    return 0;
}

执行结果:
$ ./main.exe
-20
20
-1
1

以上只是我的个人见解,若您有更好的实现方法,或者发现了此处存在问题,欢迎留言给我。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门