一次性付费进群,长期免费索取资料

进微信群回复公众号:微信群;QQ群:460500587

 教程列表 见微信公众号底部菜单 |  本文底部有推荐书籍 

微信公众号:计算机与网络安全

ID:Computer-network

由于RFID安全问题日益突出,因此针对RFID安全问题的安全认证协议相继被推出。在这些安全认证协议中,比较流行的是基于Hash 运算的安全认证协议,它对消息的加密是通过Hash算法实现的。Hash函数可以将任意长度的消息或者明文映射成一个固定长度的输出摘要。这类协议由于简单且对系统硬件资源的需求不高,因此适合在无源RFID认证中使用。最常用的Hash函数有MD5与SHA-1。

1、Hash函数

Hash,一般译作散列、杂凑或哈希,是指把任意长度的输入(又叫作预映射)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,因此不可能通过散列值来确定唯一的输入值。简单来说,Hash函数就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

所有Hash函数都有一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性使Hash函数具有确定性的结果。另一方面,Hash函数的输入和输出不是一一对应的,如果两个散列值相同,两个输入值很可能是相同的,但不能肯定二者一定相同(可能出现哈希碰撞)。输入一些数据计算出散列值,然后改变部分输入值,此时一个具有强混淆特性的Hash函数就会产生一个完全不同的散列值。

典型的Hash函数都有无限定义域,如任意长度的字节字符串和有限的值域、固定长度的比特串等。在某些情况下,Hash函数可以被设计成在相同大小定义域和值域间一一对应的函数。一一对应的Hash函数也称为排列。可逆性可以通过使用一系列对于输入值而言可逆的“混合”运算来体现。

Hash函数能使对一个数据序列的访问过程更加迅速有效。通过Hash函数,数据元素将会被更快地定位。常用Hash函数介绍如下。

① 直接寻址法:取关键字或关键字的某个线性函数值为散列地址,即H(key)=key或H(key)=a·key+b,其中a和b为常数(这种Hash函数叫作自身函数)。

② 数字分析法:分析一组数据,如一组员工的出生年月日时,我们会发现出生年月日的前几位数字大体相同,这样的话,出现冲突的概率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的概率会明显降低。因此,数字分析法就是找出数字的规律,尽可能利用这些规律来构造冲突概率较低的散列地址。

③ 平方取中法:将关键字平方后的值的中间几位作为散列地址。

④ 折叠法:将关键字分割成位数相同的几部分(最后一部分位数可以不同),然后将这几部分的叠加和(去除进位)作为散列地址。

⑤ 随机数法:选择一个随机函数,将关键字作为随机函数的种子,并将生成的随机值作为散列地址。该方法通常用于关键字长度不同的场合。

⑥ 除留余数法:将关键字被某个不大于散列表表长m的数p除后所得的余数作为散列地址,即H(key)=key MOD p, p≤m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。p的选取很重要,一般取素数或m;若p选得不好,则容易产生碰撞。

了解了Hash基本定义后,再介绍一些著名的Hash算法,消息摘要(Message-Digest 5,MD5)和SHA-1可以说是应用最广泛的Hash算法,它们都是以MD4为基础而被设计的。

1)MD4

MD4(RFC 1320)是麻省理工学院的罗纳德·李维斯特(Ronald L. Rivest)教授在1990年设计的,MD是Message Digest(消息摘要)的缩写。MD4适用于在32位字长的处理器上通过高速软件实现,MD4是基于32位操作数的位操作来实现的。

2)MD5

MD5(RFC 1321)是李维斯特于1991年对MD4进行改进所得的版本。MD5以512位分组来处理输入的信息,其输出是4个32位字的级联,与MD4相同。MD5比MD4更复杂,速度较MD4慢,但更安全,在抗分析和抗差分方面表现更好。

3)SHA-1

SHA-1是由美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)、美国国家安全局(National Security Agency,NSA)设计,与DSA一起使用,它针对长度小于264的输入会产生长度为160 bit的散列值,因此抗穷举(brute-force)性更好。SHA-1的设计基于了和MD4相同的原理,并且模仿了该算法。

Hash函数的应用具有多样性,它们经常是为某一应用而专门设计的。例如,加密Hash函数假设存在一个要找到具有相同散列值的原始输入的“敌人”,一个好的加密Hash函数是一个“单向”操作:对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造。以加密散列为目的设计的函数(如MD5)被广泛用于检验Hash函数。这样在下载软件的时候,就会在对照验证代码之后再下载正确的文件部分。此代码有可能会因为环境因素的变化(如机器配置或者IP地址的改变)而有变动,以保证源文件的安全性。

Hash算法在信息安全方面的应用主要体现在以下3个方面。

1)文件校验

我们比较熟悉的校验算法有奇偶校验和循环冗余校验(Cyclic Redundancy Check,CRC),这两种校验并没有抗数据篡改的能力,它们在一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。

MD5的“数字指纹”特性使其成为了一种应用最广泛的文件完整性校验(Checksum)和算法,不少UNIX系统都提供了计算MD5 Checksum的命令。

2)数字签名

Hash算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,因此,在数字签名协议中,单向Hash函数扮演了一个重要的角色。对Hash值(又称“数字摘要”)进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。

3)鉴权协议

鉴权协议又被称作挑战-认证模式,在传输信道可被侦听但不可被篡改的情况下,这是一种简单而安全的方法。

2、消息摘要

MD5算法作为一种经典的单向Hash函数,在文件校验、数字签名、版权协议、身份认证以及数据加密中都有广泛应用。下面从单向Hash函数开始,对MD5算法进行简单介绍。

(1)背景

MD5是在20世纪90年代初由美国麻省理工学院的计算机科学实验室和RSA数据安全公司发明的,经MD2、MD3和MD4发展而来。李维斯特在1989年开发出MD2算法。在MD2算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数;然后,以一个16 bit的检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。后来,罗吉尔(Rogier)等人发现如果忽略了检验,计算过程将和MD2产生冲突。MD2算法加密后的结果是唯一的(即不同信息加密后的结果不同)。

为了加强算法的安全性,李维斯特在1990年开发出了MD4算法。MD4算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod 512=448)。然后,一个以64 bit二进制表示的信息的最初长度被添加进来。信息被处理成512 bit迭代结构的区块,而且每个区块要通过3个不同的步骤进行处理。登布尔(Den boer)等人很快发现了攻击MD4版本中第1步和第3步的漏洞。MD4就此被淘汰。

1991年,李维斯特开发出了技术上更趋近于成熟的MD5算法。MD5在MD4的基础上增加了“安全-带子”(safety-belts)的概念。虽然MD5比MD4更加复杂,但却更为安全。这个算法很明显地由4个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。

(2)单向Hash函数

单向Hash函数,又称为哈希函数或杂凑函数,是一种把任意长度的输入消息串变化成固定长度的输出串的函数,这个输出串称为该消息的哈希值。也可以说,单向Hash函数用于找到一种数据内容和数据存放地址之间的映射关系。由于输入值大于输出值,因此,不同的输入一定有相同的输出,但是因为空间非常大,很难找出,所以,可以把Hash函数值称为伪随机数。

目前常见的单向Hash函数如下。

1)MD5是RSA数据安全公司开发的一种单向散列算法,被广泛使用,可以用于将不同长度的数据块(通过暗码运算)转换成一个128 bit(16 B)的数值。

2)SHA(Secure Hash Algorithm)是一种较新的散列算法,可以将任意长度的数据通过运算转换成一个160 bit(20 B)的数值。目前根据比特位的不同有SHA-1(160 bit),SHA-2(SHA-256:256 bit,SHA-384:384 bit,SHA-512:512 bit)等不同的SHA算法。

3)消息认证代码(Message Authentication Code,MAC)是一种使用密钥的单向函数,可以用于在系统上或用户间认证文件或消息。用于消息认证的密钥散列法(Hash-based Message Authentication Code,HMAC)就是这种函数的其中一种。

4)循环冗余校验由于实现简单和检错能力强,因此被广泛应用于各种数据校验应用中。循环冗余校验占用系统资源少,用软、硬件均能实现,是进行数据传输差错检测的一种很好的手段。

单向Hash函数有一个输入和一个输出,其中输入称为消息(m),输出称为散列值(h)。单向Hash函数主要被用于封装或者数字签名,它必须具有以下性质:

① 给定h,根据H(m)=h求m在计算上是不可行的;

② 给定m,要找到另一消息m′并满足H(m)=H(m′)在计算上是不可行的。

上述特性中的任何弱点都有可能破坏使用单向Hash函数进行封装或者数字签名的各种协议的安全性。单向Hash函数的重要之处就是赋予m唯一的“指纹”。如果用户A用数字签名算法H(m)进行签名,而用户B能产生满足H(m)=H(m′)的另一消息m′,那么用户B就可以声称用户A对m进行了数字签名。

单向Hash函数除了需要具有上述性质外还需要具有的性质有:

① 给定m,很容易计算出h;

② 抗碰撞性,即随机找到两个消息m和m′,使H(m)=H(m′)在计算上不可行。

(3)MD5算法特点与流程

Message-Digest泛指字节串(Message)的哈希变换,就是把一个任意长度的字节串变换成一个定长的大整数。这种变换只与字节的值有关,与字符集或编码方式无关。MD5可以将任意长度的“字节串”变换成一个128 B的大整数,并且哈希变换是一个不可逆的字符串变换算法。换句话说,即使看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说是因为原始的字符串有无穷多个,其功能类似不存在反函数的数学函数。

1)MD5算法特点

压缩性:任意长度的数据,算出的MD5值的长度都是固定的。

容易计算:很容易从原数据计算出MD5值。

抗修改性:对原数据进行任何改动(即使只修改1 B)所得到的MD5值都有很大区别。

强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

2)MD5算法流程

MD5算法流程如图1所示。MD5 算法可以简述为:MD5以512 bit分组来处理输入的信息,且每一分组又被划分为16个32 bit子分组,经过一系列的处理后,算法的输出由4个32 bit分组组成,将这4个32 bit分组级联后将生成一个128 bit散列值,该散列值就是要输出的结果。

图1  MD5算法流程

MD5算法可以分为5步,分别是添加填充位、填充长度、初始化缓冲区、循环处理数据和级联输出。

步骤1:添加填充位

在MD5算法中,首先须对信息进行填充,使其位长(Bits Length)对512求余的结果等于448。因此,信息的位长将被扩展至N×512+448,N为非负整数,可以是零。填充由一个1和后续的0组成。

步骤2:填充长度

以字符串为例。对一个字符串进行MD5加密,会先从字符串的处理开始。首先将字符串分割成每512 bit为一个分组,形如N×512+R,最后多出来的不足512位的R部分填充一个1和多个0,直到补足512 bit。

此外,末尾应预留出64 bit记录字符串的原长度。这里应注意,R为0时也要补位,这时候补512 bit,最高位为1,整体形如1000…00;如果R超出448,除了要补满这个分组外,还要再补一个512 bit的分组(因为R超出448 bit就不能留出64 bit来存放字符串的原长了)。此时最低的64 bit用来存放之前字符串的长度 length(长度为字符个数×8 bit)的值,如果这个length值的二进制位数大于64 bit,则只保留最低的64 bit。经过这两步的处理,信息的位长=N×512+448+64=(N+1)×512,即长度恰好是512的整数倍。这样做的目的是满足后面步骤中对信息长度的要求。

步骤3:初始化缓冲区

一个128 bit的缓冲区可用于保存Hash函数中间和最终的结果。它可以表示为4个32 bit的寄存器(A,B,C,D)。寄存器初始化为以下十六进制值。

A=67452301,B=EFCDAB89,C=98BADCFE,D=10325476

寄存器内容采用小数在前的格式存储,即将字的低字节存储在低地址字节中,如下所示。

A:01 23 45 67 B:89 AB CD EF

C:FE DC BA 98 D:76 54 32 10

步骤4:循环处理数据

循环处理数据的流程如图2所示。这一步以512 bit的分组为单位处理消息。包括4轮处理。4轮处理具有相似的结构,但每次都会使用不同的基本逻辑函数,记为F、G、H、I。

图2  循环处理数据流程

每一轮都会以当前的512 bit分组(即图2-2中的Yq)和128 bit缓冲区A、B、C、D为输入,并会修改缓冲区的内容。每次使用64元素表T[1…64]中的1/4。该T表由sin函数构造而成。T的第i个元素表示为T[i],其值等于232×abs(sin(i))的整数部分,其中i是弧度。abs(sin(i))是一个0~1的数,T的每个元素都是一个可以表示成32 bit的整数。每轮的处理会使用不同的基础逻辑函数,如下所示:

F(X,Y,Z)=(X∧Y)∨(¬X∧Z)

G(X,Y,Z)=(X∧Z)∨(Y∧¬Z)

H(X,Y,Z)=X⊗Y⊗Z

I(X,Y,Z)=Y⊗(X∨¬Z)

其中,∧表示按位与,∨表示按位或,¬表示按位反,⊗表示按位异或。

每一轮的操作流程如图3所示。以第1轮操作为例。第1轮共进行16次操作,每次操作均会首先对a、b、c、d中的3个做一次非线性函数运算;其次将所得结果加上第4个变量、文本的一个子分组Mi和一个常数ti;再次将所得结果向左环移一个不定的数Si,并加上a、b、c、d中的一个;最后用该结果取代a、b、c、d中的一个。基础逻辑函数F是一个逐位运算的函数,H是逐位奇偶操作符。

图3  操作流程

首先,定义FF(a,b,c,d,Mj,s,ti)代表的操作为a=b+((a+F(b,c,d)+Mj+ti)<

GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<

HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<

II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<

然后,可以得到第1轮的所有操作:

FF(a,b,c,d,M,7,0xd76aa478)

FF(d,a,b,c,M1,12,0xe8c7b756)

FF(c,d,a,b,M2,17,0x242070db)

FF(b,c,d,a,M3,22,0xc1bdceee)

FF(a,b,c,d,M4,7,0xf57c0faf )

FF(d,a,b,c,M5,12,0x4787c62a)

FF(c,d,a,b,M6,17,0xa8304613)

FF(b,c,d,a,M7,22,0xfd469501)

FF(a,b,c,d,M8,7,0x698098d8)

FF(d,a,b,c,M9,12,0x8b44f7af)

FF(c,d,a,b,M10,17,0xffff5bb1)

FF(b,c,d,a,M11,22,0x895cd7be)

FF(a,b,c,d,M12,7,0x6b901122)

FF(d,a,b,c,M13,12,0xfd987193)

FF(c,d,a,b,M14,17,0xa679438e)

FF(b,c,d,a,M15,22,0x49b40821)

同理,可以得到剩下3轮的所有操作,即在将A、B、C、D这4个幻数按照循环内操作处理之后循环左移一位,从而可以让4个幻数有相同的变换次数,使数据影响的分布尽可能平均,保证每位数据的变化都可以引起尽量多的对应哈希值的位变化。

第2轮的所有操作:

a=GG(a,b,c,d,M1,5,0xf61e2562)

b=GG(d,a,b,c,M6,9,0xc040b340)

c=GG(c,d,a,b,M11,14,0x265e5a51)

d=GG(b,c,d,a,M,20,0xe9b6c7aa)

a=GG(a,b,c,d,M5,5,0xd62f105d)

b=GG(d,a,b,c,M10,9,0x02441453)

c=GG(c,d,a,b,M15,14,0xd8a1e681)

d=GG(b,c,d,a,M4,20,0xe7d3fbc8)

a=GG(a,b,c,d,M9,5,0x21e1cde6)

b=GG(d,a,b,c,M14,9,0xc33707d6)

c=GG(c,d,a,b,M3,14,0xf4d50d87)

d=GG(b,c,d,a,M8,20,0x455a14ed)

a=GG(a,b,c,d,M13,5,0xa9e3e905)

b=GG(d,a,b,c,M2,9,0xfcefa3f8)

c=GG(c,d,a,b,M7,14,0x676f02d9)

d=GG(b,c,d,a,M12,20,0x8d2a4c8a)

第3轮的所有操作:

a=HH(a,b,c,d,M5,4,0xfffa3942)

b=HH(d,a,b,c,M8,11,0x8771f681)

c=HH(c,d,a,b,M11,16,0x6d9d6122)

d=HH(b,c,d,a,M14,23,0xfde5380c)

a=HH(a,b,c,d,M1,4,0xa4beea44)

b=HH(d,a,b,c,M4,11,0x4bdecfa9)

c=HH(c,d,a,b,M7,16,0xf6bb4b60)

d=HH(b,c,d,a,M10,23,0xbebfbc70)

a=HH(a,b,c,d,M13,4,0x289b7ec6)

b=HH(d,a,b,c,M,11,0xeaa127fa)

c=HH(c,d,a,b,M3,16,0xd4ef3085)

d=HH(b,c,d,a,M6,23,0x04881d05)

a=HH(a,b,c,d,M9,4,0xd9d4d039)

b=HH(d,a,b,c,M12,11,0xe6db99e5)

c=HH(c,d,a,b,M15,16,0x1fa27cf8)

d=HH(b,c,d,a,M2,23,0xc4ac5665)

第4轮的所有操作:

a=II(a,b,c,d,M,6,0xf4292244)

b=II(d,a,b,c,M7,10,0x432aff97)

c=II(c,d,a,b,M14,15,0xab9423a7)

d=II(b,c,d,a,M5,21,0xfc93a039)

a=II(a,b,c,d,M12,6,0x655b59c3)

b=II(d,a,b,c,M3,10,0x8f0ccc92)

c=II(c,d,a,b,M10,15,0xffeff47d)

d=II(b,c,d,a,M1,21,0x85845dd1)

a=II(a,b,c,d,M8,6,0x6fa87e4f)

b=II(d,a,b,c,M15,10,0xfe2ce6e0)

c=II(c,d,a,b,M6,15,0xa3014314)

d=II(b,c,d,a,M13,21,0x4e0811a1)

a=II(a,b,c,d,M4,6,0xf7537e82)

b=II(d,a,b,c,M11,10,0xbd3af235)

c=II(c,d,a,b,M2,15,0x2ad7d2bb)

d=II(b,c,d,a,M9,21,0xeb86d391)

步骤5:级联输出

处理完所有512 bit分组后,将A、B、C、D级联输出。输出时应考虑当前机器环境是大端序(Big-Endian,也称大字节序、高字节序,即低位字节排放在内存中的高地址端,高位字节排放在内存中的低地址端)还是小端序(Little-Endian,也称小字节序、低字节序,即低位字节排放在内存中的低地址端,高位字节排放在内存中的高地址端),并需注意字节序的转换。最后输出的结果就是128 bit消息摘要。

3、RFID安全认证协议

3次握手的认证协议是RFID系统认证的一般模式。第1次握手时,阅读器向标签发送信息,当标签接收到信息后,即可明确自身的接收功能是正常的;第2次握手时,标签向阅读器发送信息作为应答,当阅读器接收到信息后,阅读器即可明确自身的发送和接收功能都正常;第3次握手时,阅读器向标签发送信息,当阅读器接收到信息后,标签可以明确自身的发送功能是正常的。通过3次握手,就能明确双方的收发功能均正常,也就是说,可以保证建立的连接是可靠的。在这种认证过程中,属于同一应用的所有标签和阅读器共享同一加密钥,所以3次握手的认证协议具有安全隐患。为了提高RFID认证的安全性,研究人员设计了大量的RFID安全认证协议。RFID安全认证协议的核心是Hash函数。下面介绍几种典型的RFID安全认证协议。

(1)Hash-Lock协议

Hash-Lock协议是一种隐私增强技术,不直接使用真正的节点ID,而是使用一种短暂性节点(临时节点)ID,这样做的好处是可以保护真实的节点ID。

为了防止数据信息泄露和被追踪,萨尔马(Sarma)等人提出了基于不可逆Hash函数加密的安全协议Hash-lock。RFID系统中的标签内存储了两个标签ID:metaID与真实ID。metaID与真实ID是通过Hash函数计算标签的密钥key而来一一对应的,即metaID=Hash(key)。后台应用系统中的数据库对应存储了标签的3个参数:metaID、真实ID和key。

当阅读器向标签发送认证请求时,标签先将metaID(代替真实ID)发送给阅读器,然后进入锁定状态;阅读器收到metaID后会将其发送给后台应用系统,后台应用系统查找相应的key和真实ID,最后返还给标签;标签将接收到的key值进行Hash函数取值,判断所取得值与自身存储的metaID值是否一致。如果一致,则标签就将真实ID发送给阅读器开始认证;如果不一致,则认证失败。

Hash-Lock协议的流程如图4所示。

图4  Hash-Lock协议流程

Hash-Lock协议的执行过程如下:

1)阅读器向标签发送Query认证请求;

2)标签将metaID发送给阅读器;

3)阅读器将metaID转发给后台数据库;

4)后台数据库查询自己的数据库,如果找到与metaID匹配的项,就将该项的(key,ID)发送给阅读器,其中ID为待认证标签的标识,metaID≡H(key);否则,返回给阅读器认证失败信息;

5)阅读器将从后台数据库接收到的部分信息key发送给标签;

6)标签验证metaID=Hash(key)是否成立,如果成立,则将其ID发送给阅读器;

7)阅读器比较从标签接收到的ID是否与后台数据库发送过来的ID一致,如果一致,则认证通过,否则认证失败。

由上述过程可以看出,Hash-Lock协议中没有ID动态刷新机制,并且metaID也保持不变,ID是以明文的形式通过不安全的信道传送的,因此Hash-Lock协议非常容易受到假冒攻击和重传攻击,攻击者也可以很容易地对标签进行追踪。也就是说,Hask-Lock协议没有达到其安全目标。

通过对Hash-Lock协议过程进行分析不难看出,该协议没有实现对标签ID和metaID的动态刷新,并且标签ID是以明文的形式进行传输的,这不能防止假冒攻击、重放攻击和跟踪攻击;此外,此协议在数据库中搜索的复杂度O(n)是呈线性增长的,还需要O(n)次加密操作,这在大规模RFID系统中应用得不理想,因此Hash-Lock并没有达到预期的安全目标,但是提供了一种很好的安全思想。

(2)随机化Hash-Lock协议

由于Hash-Lock协议的缺陷导致其没有达到预想的安全目标,因此韦斯(Weiss)等人对Hash-Lock协议进行了改进,改进过程中采用了基于随机数的询问-应答机制。随机化Hash-Lock协议如图5所示。

图5  随机化Hash-Lock协议

该方法的思想如下:标签内存储了标签IDi与一个随机数产生程序,标签接收到阅读器的认证请求后将(Hash(IDi|| R), R)发送给阅读器,其中R由随机数产生程序生成。在收到标签发来的数据后,阅读器请求获得数据库所有的标签ID1、ID2、…、IDn。阅读器计算是否有一个IDk(1≤k≤n)满足Hash(IDk|| R)=Hash(IDi|| R),如果有,则将IDk发给标签,标签将收到的IDk与自身存储的IDi进行对比并做出判断。

随机化Hash-Lock协议的执行过程如下:

1)阅读器向标签发送Query认证请求;

2)标签生成一个随机数R,计算H(IDk|| R),其中IDk为标签的标志,标签将R,H(IDk|| R)发送给阅读器;

3)阅读器向后台数据库提出获得所有标签标志的请求;

4)后台数据库将自己数据库中的所有标签标志(ID1,ID2,…,IDn)发送给阅读器;

5)阅读器检查是否有某个IDj(1≤j≤n)可使H(IDj|| R)=H(IDk|| R)成立,如果有则认证通过,并将IDj发送给标签;

6)标签验证IDj与IDk是否相同,如果相同,则认证通过。

在随机化Hash-Lock协议中,认证通过后的标签标志IDk仍以明文的形式通过不安全信道传送,因此攻击者可以对标签进行有效追踪。同时,一旦获得了标签的标志IDk,攻击者就可以对标签进行假冒。当然,该协议也无法抵抗重传攻击。因此,随机化Hash-Lock协议也是不安全的。不仅如此,每次标签认证时,后台数据库都需要将所有标签的标志发送给阅读器,二者之间的数据通信量很大。由此可见,该协议也不实用。

(3)Hash Chain协议

由于以上两种协议的不安全性,大久保(Okubo)等人又提出了基于密钥共享的询问-应答安全协议,即Hash Chain协议,该协议具有完美的前向安全性。与以上两个协议不同的是,Hash Chain协议通过两个Hash函数H与G来实现,H的作用是更新密钥和产生秘密值链,G用来产生响应。每次认证时,标签会自动更新密钥,且标签和后台应用系统会预先共享一个初始密钥kt,1。该协议如图6所示。在第i次与阅读器交换数据时,标签有其初始值Si,标签会发送ai=G(Si)给阅读器,再根据以前的Si更新密钥Si+1=H(Si)。其中G和H都是Hash函数。

图6  Hash Chain协议

该协议满足了不可分辨和前向的安全特性。G是单向方程,因此攻击者能获得标签输出钩,但是不能从ai获得Si。G输出随机值,因此攻击者能观测到标签输出,但不能把ai和ai+1联系起来。H也是单向方程,因此攻击者能篡改标签并获得标签的密钥值,但不能从Si+1获得Si。该协议的优势很明显,但是有太多的计算和比较过程。为了识别一个ID,后台服务器不得不计算ID列表中的每个ID。假设在数据库中有N个已知的标签ID,则数据库不得不进行N次ID搜索、2N次Hash方程计算和N次比较。计算机处理负载会随着ID列表长度的增加呈线性增加,因此该方法也不适合存在大量标签的情况。

为了克服上述情况,大久保等人提出了一种能够减少可测量性的时空内存折中方案,其协议如图7所示。其本质也是基于共享密钥的询问-应答协议。但是在该协议中,当使用两个不同Hash函数的阅读器发起认证时,标签总是会发送不同的应答。值得说明的是,提出者声称该折中的Hash-Chain协议具有完美的前向安全性。

图7  折中的Hash Chain协议

在系统运行之前,标签和后台数据库首先要预共享一个初始密钥值St,1。标签和阅读器之间执行第j次Hash Chain的过程如下:

1)阅读器向标签发送Query认证请求;

2)标签使用当前的密钥值St,j计算at,j=H(St,j),并更新其密钥值为St,j+1=H(St,j),标签将at,j发送给阅读器;

3)阅读器将IDt转发给后台数据库;

4)后台数据库针对所有的标签数据项查找并计算是否存在某个IDt(1≤t≤n)以及是否存在某个j(1≤j≤m,其中m为系统预设置的最大链长度)。如果有,则认证通过,并将IDt发送给标签,否则认证失败。

实质上,在该折中的Hash Chain协议中,标签成为了一个具有自主更新能力的主动式标签。同时,由上述流程可以看出,该折中的Hash Chain协议是一个单向认证协议,即它只能对标签身份进行认证。不难看出,该协议非常容易受到重传攻击和假冒攻击,只要攻击者截获某个at,j,就可以进行重传攻击,伪装标签通过认证。此外,每次标签认证发生时,后台数据库都要对每个标签进行j次Hash运算,因此计算载荷也很大。同时,该协议需要两个不同的Hash函数,这也增加了标签的制造成本。

(4)基于Hash的ID变化协议

基于Hash的ID变化协议与Hash Chain协议相似,每一次应答中的ID交换信息都不相同。该协议可以抗重传攻击,因为系统使用了一个随机数R对标签标志不断地进行动态刷新,同时还对TID(最后一次应答号)和LST(最后一次成功的应答号)信息进行更新。该协议如图8所示。

图8  基于Hash的ID变化协议

基于Hash的ID变化协议的执行过程如下:

1)阅读器向标签发送Query认证请求;

2)标签将当前应答号加1,并将H(ID)、H(TID×ID)、ΔTID发送给阅读器,可以使后台数据库恢复出标签的标志,ΔTID则可以使后台数据库恢复出TID、H(TID×ID);

3)阅读器将H(ID)、H(TID×ID)、ΔTID转发给后台数据库;

4)依据所存储的标签信息,后台数据库检查所接收数据的有效性,如果数据全部有效,则它产生一个秘密随机数R,并将(R,H(R×TID×ID))发送给阅读器,然后数据库更新该标签的ID为ID⊕R,并相应地更新TID和LST;

5)阅读器将(R,H(R×TID×ID))转发给标签;

6)标签验证所接收信息的有效性;如果有效,则认证通过。

通过以上步骤的分析可以看出,该协议有一个弊端是后台应用系统更新标签ID和LST与标签更新的时间不同步。后台应用系统更新是在第4步,而标签更新是在第5步,此刻后台应用系统已经更新完毕。如果攻击者在第5步进行数据阻塞或者干扰,导致标签收不到(R,H(R×TID×ID)),则会造成后台存储标签数据与标签更新数据不同步,这又会导致下次认证失败。所以,该协议不适用于分布式RFID系统环境,且存在数据库同步的潜在安全隐患。

(5)数字图书馆RFID协议

戴维(David)等人提出了数字图书馆RFID协议,其使用基于预共享密钥的伪随机函数来实现认证,如图9所示。

图9  数字图书馆RFID协议

David提出的数字图书馆RFID协议的执行过程如下:

1)当标签进入阅读器的识别范围后,阅读器向其发送Query消息以及阅读器产生的秘密随机数RR,请求认证;

2)标签接收到阅读器发送过来的请求消息后,自身生成一个随机数RT,结合标签自身的ID和秘密值k计算出δ=IDi⊕Fs(0,RR,RT),计算完成后,标签将(RT,δ)一起发送给阅读器;

3)阅读器将标签发送过来的数据(RT,δ)转发给后台数据库;

4)后台数据库查找数据库中存储的所有标签ID,看其中是否有一个IDj(1≤j≤n)满足IDj=δ⊕Fs(0,RR,RT),若有,则认证通过,同时计算β=IDi⊕Fs(1,RR,RT)并将其传输给阅读器;

5)阅读器将β发送给标签,标签对收到的β进行验证,看其是否满足ID=β⊕IDi⊕Fs(1,RR,RT),若满足,则认证成功。

截至目前,David的数字图书馆RFID协议还没有出现比较明显的安全漏洞,唯一的不足是,为了实现该协议,标签内必须内嵌伪随机数产生程序和加解密程序,这会增加标签设计的复杂程度,故而设计成本也会相应提高,因此该协议不适合小成本的RFID系统。

(6)分布式RFID询问-应答认证协议

分布式RFID询问-应答认证协议是里(Rhee)等人基于分布式数据库环境提出的双向认证RFID系统协议,如图10所示。

图10  分布式RFID询问-应答认证协议

分布式RFID询问-应答认证协议的执行过程如下。

1)当标签进入阅读器的识别范围后,阅读器向其发送Query消息以及阅读器产生的秘密随机数RR,请求认证。

2)标签接到阅读器发送过来的请求后,生成一个随机数RT,并计算出H(ID || RR|| RT),ID是标签的ID,H为标签和后台数据库共享的Hash函数。然后,标签将(H(ID || RR|| RT),RT)发送给阅读器。

3)阅读器收到标签发送来的(H(ID || RR|| RT),RT)后,向其中添加之前自己生成的随机数RR,并将(H(ID || RR|| RT),RT,RR)一同发给后台数据库。

4)后台数据库收到阅读器发送来的数据后,检查数据库存储的标签ID中是否有一个IDj(1≤j≤n)满足H(IDj|| (RR|| RT)=H(ID || RR|| RT),若有,则认证通过,并把H(IDj|| RT)发送给阅读器。

5)阅读器把H(IDj|| RT)发送给标签进行验证,若H(IDj|| RT)=H(ID || RT),则认证通过,否则认证失败。

该协议与上一个协议一样,目前为止还没有发现明显的安全缺陷和漏洞,不足之处在于成本太高,不适合小成本RFID系统,因为一次认证过程需要两次Hash运算,阅读器和标签都需要内嵌随机数生成函数和模块。

(7)低成本鉴析协议

低成本鉴析协议(Low-cost Authentication Protocol,LCAP)是基于标签ID动态刷新的询问-应答双向认证协议。但是与前面的其他同类协议不同,它每次执行之后都要动态刷新标签的ID。该协议如图11所示。

图11  低成本鉴析协议

低成本鉴析协议的执行过程如下。

1)当标签进入阅读器的识别范围后,阅读器向其发送Query消息以及阅读器产生的秘密随机数R,请求认证。

2)标签收到阅读器发送过来的数据后,利用Hash函数计算出HaID=H(ID)以及HL(ID || R),其中ID为标签的ID,HL表示Hash函数映射值的左半部分,即H(ID || R)的左半部分;之后标签将(HaID,HL(ID || R))一起发送给阅读器。

3)阅读器收到(HaID,HL(ID || R))后,在其中添加之前发送给标签的随机数R,整理后将(HaID,HL(ID || R),R)发送给后台数据库。

4)后台数据库收到阅读器发送过来的数据后,检查数据库存储的HaID是否与阅读器发送过来的一致。若一致,则利用Hash函数计算R和数据库存储的HaID的HR(ID || R),HR表示Hash函数映射值的右半部分,即H(ID || R)的右半部分,同时后台数据库更新HaID为H(ID⊕R),ID为ID⊕R。将之前存储的数据中的TD数据域设置为HaID=H(ID⊕R),然后将HR(ID || R)发送给阅读器。

5)阅读器收到HR(ID || R)后将其转发给标签。标签收到HR(ID || R)后验证其有效性,若有效,则认证成功。

通过对以上流程的分析不难看出,LCAP存在与基于Hash的ID变化协议一样的不足,就是标签ID更新不同步,后台数据库更新在第4步,而标签更新是在其更新之后的第5步,如果攻击者攻击导致第5步不能成功,就会造成标签数据不一致,进而导致认证失败以及下一次认证的失败。因此该协议不适用于分布式数据库RFID系统。

以上几种安全认证协议可分为两类:单项认证和双向认证。单项认证只对标签的合法性进行认证,条件是阅读器和后台数据库绝对安全,主要代表有Hash-Lock协议和随机化Hash-Lock协议,认证速度快,成本低,但是安全性低。双向认证是指阅读器、后台数据库在对标签进行验证的同时,标签也要对阅读器、后台数据库进行验证,这类协议安全性强,但是成本高。

表1对几种RFID安全认证协议的抗攻击能力进行了比较。

表1  RFID安全认证协议的抗攻击能力对比

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】

字符串 hash 唯一数字_物联网安全:基于Hash的RFID安全认证协议相关推荐

  1. 字符串 hash 唯一数字_【数字课堂】酒妹带你了解“身份认证技术”

    身份认证技术是在计算机网络中确认操作者身份的过程而产生的有效解决方法.计算机网络世界中一切信息包括用户的身份信息都是用一组特定的数据来表示的,计算机只能识别用户的数字身份,所有对用户的授权也是针对用户 ...

  2. python3提取字符串中的数字_如何在Python中从字符串中提取数字?

    14 回复 | 直到 1 年前 1 430 3 年前 如果只想提取正整数,请尝试以下操作: >>> str = "h3110 23 cat 444.4 rabbit 11 ...

  3. 60秒计时器的仿真电路_物联网应用基于Arm微控制器的低功耗定时关机计时器

    本文首发极术社区 作者:Philex Fan 翻译:Khorina 原文:物联网应用基于Arm微控制器的低功耗定时关机计时器 由于物联网传感器节点的尺寸形式非常小,他们的计算平台有严格的能源约束.为了 ...

  4. java中如何检查字符串都是数字_如何在Java中检查字符串是否为数字?

    我们将检查字符串是否为数字-借助逻辑,我们将解决此问题,第一步,我们将使用一个名为str的字符串变量,并将任何值存储在其中. 在第二步中,我们将使用一个名为str_numeric的布尔变量,该变量存储 ...

  5. 服务器ipv4协议认证,基于TCP/IP应用层密码认证协议的研究

    Internet在全世界盛行,它的基础协议就是传输控制协议/网际协议(TCP/IP).TCP/IP是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据往来以及传送方式 ...

  6. mybatis字符串转成数字_计算机储存数字和字符的方法你了解多少?

    前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考. 本文链接: http://1t.click/J7E 前言 最近在学习中涉及到计算机储存.传输数字和字符等操作,由于对字节.2进制.10进 ...

  7. angular 字符串转换成数字_一文看懂Python列表、元组和字符串操作

    好文推荐,转自CSDN,原作星辰StarDust,感觉写的比自己清晰-大江狗荐语. 序列 序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力 ...

  8. angular 字符串转换成数字_蓝盟IT外包,Python算法的一般技术和嵌入式库|python|字符串|key|算法|调用...

    近年来,随着python着火,python也开始受到很多程序员的喜爱. 很多程序员已经开始使用python作为第一语言. 最近在python上刷问题时,我想去找python的刷问题常用库api和刷问题 ...

  9. python 字符串加密 唯一数字_python实现字符串加密 生成唯一固定长度字符串

    背景 有时候爬虫爬过的url需要进行指纹核对,比如Scrapy就是进行指纹核对,如果是指纹重复则不再爬取.当然在入库的时候我还是需要做一次核对,否则如果爬虫有漏掉,进入数据库就不合适了. 思路 根据S ...

  10. java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...

    1.什么是hash表? 答:简单回答散列表,在hash结构散列(分散)存放的一种数据集结构. 2.如何散列排布,如何均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) ...

最新文章

  1. OpenCV 【十二】OpenCV如何扫描图像、利用查找表和计时
  2. H5 新标签用法及解释
  3. RhinoMock入门(7)——Do,With和Record-playback
  4. ORACLE告警日志文件
  5. 场景法设计测试用例atm_测试用例设计经典面试题之电梯、杯子、笔、桌子、洗衣机、椅子、ATM等...
  6. 第十九节:Asp.Net Core WebApi知识总结(一)
  7. 数据分析:为什么说Python比Excel更简单高效 ?
  8. 大整数减法(信息学奥赛一本通-T1169)
  9. yarn-cli 缓存(转)
  10. 如何评价「施一公请辞清华大学副校长,全职执掌西湖大学」?你如何看待西湖大学的发展前景?
  11. python从mongodb里取出数据进行可视化_Python数据分析及可视化实例之MongoDB增删改查...
  12. Android:通过Intent传递对象、Parcelable
  13. 移动前端开发之viewport的深入理解 --- 待续
  14. ubuntu 14.04中安装phpmyadmin即mysql图形管理界面
  15. x200装linux驱动下载,佳能 ThinkPad X200 Tablet 驱动程序下载-更新佳能软件(平板电脑)...
  16. 聚观早报 | 通信行程卡正式宣布下线;《三体》首日播放量破1亿
  17. 3.图灵学院-----阿里/京东/滴滴/美团整理----高频JVM调优篇
  18. HashMap的四种同步方式
  19. 图形编辑器:对齐功能的实现
  20. long(Long)与int(Integer)四种类型之间互相转换的方法分享

热门文章

  1. aGlass学习笔记 1
  2. unity调用dll打开双目
  3. Atitit layout art 布局的艺术目录1. SpringLayout 类 弹簧布局管理器 12. BoxLayout( html默认布局) 11.SpringLayout
  4. Atitit 下推自动机﹙PDA﹚说明书 目录 1. 概念组成与原理成分 1 2. 性状 1 3. 适用场景 主治 适应症 1 3.1. 所有场景()。 1 3.2. 语法解析 构建ast 2 3.
  5. Atitit 查询优化器的流程attilax总结
  6. Atitit.swt 线程调用ui控件的方法
  7. paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.
  8. paip. sip module implements API v10.0 to v10.1 but the PyQt4.QtCore module requires API v9.2
  9. paip.php调试脱离IDE VC59
  10. 央行等四部门发布资管新规全文