字符串比较函数

计时攻击

  • 在密码学中,时序攻击是一种侧信道攻击,攻击者试图通过分析加密算法的时间执行来推导出密码。每一个逻辑运算在计算机需要时间来执行,根据输入不同,精确测量执行时间,根据执行时间反推出密码。
  • 正常的字符串比较,一旦遇到第一个不同的字符就返回失败了,所以,理论上讲,前面只有 2 个字符相同的字符串比较的耗时,要比前面有 10 个字符相同是的比较要短,可能就少几微妙。但是,如果我们放大这个事,重复 50 次,查看平均时间,以了解哪个字符返回的时间比较长,如果某个我们要尝试的字符串的时间比较长,我们就可以确定地得出这个字符串的前面一段必然是正确的。

防止计时攻击的字符串比较函数

#include <stdio.h>
#include <ctype.h>

/** @brief	比较俩个字符串的前N个字符是否相等(区分大小写)(防止计时攻击)
 *  @param	str1 第一个要比较的字符串
 * 	@param	str2 第二个要比较的字符串
 * 	@param	size 比较的长度
 * 	@retval	成功返回0,失败返回非0
*/
int util_strncmp(const char * str1, const char * str2, const size_t size)
{
    unsigned char result = 0;
    size_t i;
	if (!str1 || !str2 || !size) /* 比较固定长度的字符串。对于用户秘密来说,字符串的长度也应该属于“隐私数据” */
		return -1;
    for (i = 0; i < size; i++)
    {
        result |= str1[i] ^ str2[i]; 
        //异或的方式不是遇到第一个不一样的字符就返回false了,而是要做全量比较,为了安全牺牲效率。
    }
    return result;
}
/** @brief	比较俩个字符串的前N个字符是否相等(不区分大小写)(防止计时攻击)
 *  @param	str1 第一个要比较的字符串
 * 	@param	str2 第二个要比较的字符串
 * 	@retval	成功返回0,失败返回非0
*/
int util_strncmp(const char * str1, const char * str2, const size_t size)
{
    unsigned char result = 0;
    size_t i;
	if (!str1 || !str2 || !size) 
		return -1;
    for (i = 0; i < size; i++)
    {
        result |= tolower(str1[i]) ^ tolower(str2[i]);
    }

    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光头,强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值