top
友情提示
测试消息
确定
友情提示

处理中,请稍后...

实现安全的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

以上只是我的个人见解,若您有更好的实现方法,或者发现了此处存在问题,欢迎留言给我。
标签
secure_strcmp
安全
上一篇:JSP九大内置对象及相关作用域
下一篇:抽象类和接口
文章阅读完了, 快到评论区留下你的看法吧!
Email:
验证码:
昵 称 :
评论列表
热门标签
今日倒计时
小时 分钟
年少不识曲中意,再听已是曲中人
加油吧骚年
文章分类
最新文章
浏览排行
分享

关于友情链接

友情链接申请请到留言板块留言。注明网站名称及网址。期待您的友链,欢迎留言。
最新留言
[2018/04/07]太难找了,找到了
[2018/03/20]Entry fileTemplates//Singleton.java.ft not found in C:/Dev/android-studio/lib/resources_en.jar 该错误对我们使用AS没有影响吗?为什么复制保存后重新创建一个新的之后这个错误又出现了?
[2018/01/23]815cce30b85eb6b7ee7930c09135fcf7好漂亮的博客空间啊
[2018/01/06]好漂亮的博客.......
[2017/12/26]试试水
[2017/12/20] 博主可以分享一下这个源码不, 很喜欢这个博客
[2017/11/19]你加我友链了????
[2017/11/19]你的alert 很不友好哈
[2017/11/19]友链已添加
[2017/11/19]路过帮踩。
Copyright © 2018 DevSONG . All rights reserved. 有疑问或者建议? 留言给我或者E-mail me
滇ICP备17002307号-3