关于蓝牙的安全机制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于蓝牙的安全机制
蓝牙技术提供短距离的对等通信,它在应用层和链路层上都采取了保密措施以保证通信的安全性,所有蓝牙设备都采用相同的认证和加密方式。在链路层,使用4个参数来加强通信的安全性,即蓝牙设备地址BD_ADDR、认证私钥、加密私钥和随机码RAND。
蓝牙设备地址是一个48位的IEEE地址,它唯一地识别蓝牙设备,对所有蓝牙设备都是公开的;认证私钥在设备初始化期间生成,其长度为128比特;加密私钥通常在认证期间由认证私钥生成,其长度根据算法要求选择8~128比特之间的数(8的整数倍),对于目前的绝大多数应用,采用64比特的加密私钥就可保证其安全性;随机码由蓝牙设备的伪随机过程产生,其长度为128比特。
一、随机码生成
每个蓝牙设备都有一个伪随机码发生器,它产生的随机数可作为认证私钥和加密私钥。在蓝牙技术中,仅要求随机码是不重复的和随机产生的。“不重复”是指在认证私钥生存期间,该随机码重复的可能性极小,如日期/时间戳;“随机产生”是指在随机码产生前不可能预测码字的实际值。
二、密钥管理
加密私钥的长度是由厂商预先设定的,用户不能更改。为防止用户使用不允许的密钥长度,蓝牙基带处理器不接受高层软件提供的加密私钥。
若想改变连接密钥,必须按基带规范的步骤进行,其具体步骤取决于连接密钥类型。
1.密钥类型
连接密钥是一个128比特的随机数,它由两个或多个成员共享,是成员间进行安全事务的基础,它本身用于认证过程,同时也作为生成加密私钥的参数。
连接密钥可以是半永久的或临时的。半永久连接密钥保存在非易失性存储器中,即使当前通话结束后也可使用,因此,它可作为数个并发连接的蓝牙设备间的认证码。临时连接密钥仅用于当前通话。在点对多点的通信中,当主设备发送广播信息时,将采用一个公共密钥临时替换各从设备当前的连接密钥。
为适应各种应用,定义如下密钥类型:
组合密钥KAB:设备密钥KA;临时密钥Kmaster;初始密钥Kinit。
此外,Kc表示加密私钥。任何时候执行连接管理器(LM)命令进行加密时,加密私钥就会自动改变。
对蓝牙设备而言,KAB和KA在功能上没有区别,只是生成方法不同而已。KA由设备自身生成,且保持不变;KAB由设备A和设备B提供的信息共同生成,只要有两个设备产生一个新的连接,就会生成一个KAB。
究竟采用KA或KAB,取决于具体应用。对于存储容量较小的蓝牙设备或者对于处于大用户群中的设备,适合采用KA,此时只需存储单个密钥。对于要求较高安全级别的应用,适宜采用KAB,但要求设备拥有较大的存储空间。
Kmaster仅用于当前通话,它可以临时替换连接密钥。
Kinit在初始化期间用作连接密钥,以保证初始化参数的安全传送,它由一个随机数、PIN码的低8位及BD_ADDR生成。
PIN码可以是蓝牙设备提供的一个固定码,也可以由用户任意指定,但两个设备中的PIN码必须匹配。在两个设备中采用用户指定的PIN码比采用设备自身提供的PIN码更安全;即使采用固定的PIN码方式,也应该允许能够改变PIN码,以防止获得该PIN码的用户重新初始化设备。如果找不到可用的PIN 码,则使用缺省值0。短PIN码可以满足许多具体应用的安全性要求,但存在不确定的非安全因素;过长的PIN码不利于交换,需要应用层软件的支持。因而,在实际应用中,常采用短的数据串作为PIN码,其长度一般不超过16字节。
2.密钥生成及初始化
蓝牙设备必须生成各种连接密钥,以便认证例程使用。连接密钥有保密性要求,因而不能象设备地址那样公开查询。进行认证和加密的两个设备在初始化阶段单独地交换密钥,初始化过程包括以下5个部分:生成kinit;认证;生成连接密钥;交换连接密钥;各自生成加密私钥。
初始化后,设备间可继续通信,也可断开连接。若想对信息加密,则利用当前连接密钥生成的加密私钥,采用E0算法(此文中提到的E0、E21、E22和E3等算法,均作为名词使用,而不给出具体的公式)进行加密。在两个设备间建立新的连接时,则使用公共连接密钥代替Kinit进行认证。在进行一次新的加密时,将由特定的连接密钥生成一个新的加密私钥。如果没有连接密钥有效,LM将自动开始一个初始化过程。
(1)初始密钥Kinit生成
初始化期间使用的连接密钥称之为Kinit,其长度为128比特,由E22算法生成,算法的输入参数为申请连接的设备地址BD_ADDR、PIN码、PIN码的长度及随机数IN_RAND。Kinit用于连接密钥生成期间的密钥交换和未登记连接密钥的两设备间的认证,它在连接密钥交换完成后废弃。
Kinit生成后,PIN码将会随着申请设备的BD_ADDR而增长。算法要求PIN码的长度最大不超过16字节,以便确保只有特定的设备才能连接上。非法用户需要试验大量的PIN码,而且每次都必须使用不同的BD_ADDR,否则进行下一次实验需等待的时间间隔将按指数增长,这样可以减小入侵者对合法用户的威胁。
(2)认证
如果两个设备未曾联系过,它们将把Kinit作为连接密钥。在每次认证期间,都会产生一个新的认证随机数AU_RANDA。相互认证时,首先进行单向认证,再进行反方向认证。
当认证成功时,就会计算出一个辅助参数--认证加密偏移量ACO。在相互认证时,一般保留第二次认证时计算出的ACO,如果认证事件在两个设备中同时发生,则两个设备都将使用主设备产生的ACO。
(3)设备密钥KA的生成
KA在蓝牙设备首次工作时由E21算法生成并保存在非易失性存储器中,以后基本不变。初始化后,若KA发生了变化,则此前已初始化的设备保存的连接密钥将是错误的。初始化期间,应用程序一般选择存储能力较小的设备的KA作为连接密钥。
(4)组合密钥KAB的生成
组合密钥在初始化期间由设备A和B分别产生的随机数合成。首先,设备A、B分别产生随机数LK_RANDAL和LK_RANDB;然后,设备A、B采用如下算法再分别生成随机数LK_KA和LK_KB,即: LK_KA =E21LK_RANDA,BD_ADDRA , EQ21
LK_KB =E21LK_RANDA,BD_ADDRB ; EQ22
接着,设备A、B分别计算CA=LK_RANDA K和CB=LK_RANDB K(在初始化时,K=Kinit)并交换计算结果;之后,设备A、B分别计算LK_KB(EQQ22)和LK_KA(EQ21);最后,设备A、B通过异或运算分别生成128比特的组合密钥KAB和KBA,两者是相等的。
(5)加密私钥Kc的生成
加密私钥Kc由当前的连接密钥、96比特的加密偏移量(COF)、128比特的随机数通过E3算法生成。其中:
COF=BD_ADDR串联BD_ADDR链路密钥为Kmaster时 ACO其它(EQ23)
每当LM激活加密进程时,设备都将采用E3算法自动改变加密私钥Kc。
(6)点对多点通信
使用加密方式进行点对多点的通信时,主设备可以使用不同的加密私钥与每一个从设备进行通信。如果某个应用要求从设备接收广播信息,从设备却是单独收发信息的,将造成网络通信容量的减小。另外,蓝牙从设备不支持两个或多个密钥的实时交换,因而在蓝牙技术中,主设备通知各从设备采用一个公用密钥Kmaster接收加密的广播信息。对于多数应用来说,此密钥只具有临时意义。
主设备在确认所有从设备都能成功接收后,就发送一条指令,让各从设备用Kmaster替换它们当前的连接密钥。进行加密之前,主设备将产生并分发一个公共的随机数EN_RAND给所有从设备,从设备就使用Kmaster和EN_RAND产生新的加密私钥。
当所有从设备都得到了必要的数据后,主设备将使用新的加密私钥在网络中进行通信联系。显然,拥有Kmaster的从设备不仅能获得发送给自己的信息,还能获取所有加密的广播信息。如有必要,主设备可令所有从设备同时恢复使用以前的连接密钥。
(7)连接密钥的修改
在某些情况下,需要修改基于设备密钥的连接密钥。设备密钥在设备首次使用时创建,由于多个设备可能共享作为连接密钥的同一个设备密钥,因此,一旦创建几乎不再更改,否则将重新初始化所有试图连接的设备。在某些应用中这样做是必要的,如拒绝以前访问过的设备接入。