篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个eclipse里面如何建立两个互不影响的project, 如建立一个Cproject和一个javaproject?相关的知识,希望对你有一定的参考价值。
一种物联网M2M通信密钥协商方案
引言
在一个物联网网络里,当两个互不受信的节点之间,想要临时地安全通信时,需要安全地建立起一个“弱连接”,以用于受限通信,这种受限访问,体现在“资源访问”的受限,和“通信有效期”的受限。
问题的核心在于:互不信任的双方,如何达成可信。
应用到物联网领域,互不受信的两个节点之间,如何在一个不安全的链路上协商出一个临时会话密钥Kses,从而两者可以建立安全通信链路。在密钥超出生存期T后,安全链路能够中断。
该方案能够应用到以下场景:
1. 网关和节点之间,无需互相保存对方的根密钥,建立安全的通信链路。
2. 手机和网关之间,无需互相保存对方的根密钥,建立安全的通信链路。
3. 手机和节点之间,无需互相保存对方的根密钥,建立安全的通信链路。
4. 任意两节点之间,无需互相保存对方的根密钥,建立安全的通信链路。
方案概念
要想让互不信任的双方达成可信,一共有三种方案,分别举几个生动形象的例子来说明。
l 方案一:提前预置密钥
A、B、C、D四个地下党员互不认识,但每个人都有可能和其他三个人接头。一种简单的思路就是,每个人跟其他三个人都由组织提前约定好一个独立的暗号,见面后对得上暗号,就代表是能信任的人。
这种方案有两个弊端:
a) 每个人都要存储n-1个暗号,整个组织要存储的暗号量是N*(N-1),随着组织的扩大,存储的暗号量会指数级增长。这就是密码学中著名的N2密钥分配问题。
b) 当有第n+1个地下党加入组织时,该地下党要与组织里所有人建立新的暗号。
这种方案只适用于节点规模比较小,并且不会频繁增加节点的场景。不适合大规模物联网的方案。
l 方案二:中间人担保
还是上面地下党的例子,A、B、C、D四个地下党员互相不认识,但是它们都认识地下党组织的领导老K,而且对老K绝对信任。当A、B、C、D中某两个党员想接头时,约定先去老K家碰个头。老K证明双方都是同一战壕的兄弟,并告诉两个人一个临时的暗号,后续一段时间内两人就可以放心的直接通信了。
这种方案完美的解决了方案一的两个问题,但是要依赖一个中心节点。
l 方案三:去中心化的P2P网络,区块链方案
还是上面地下党的例子,A、B、C、D四个地下党员互相不认识,并且也不存在一个大家都相信的领导老K,整个组织很庞大,而且有可能有内鬼。当A要与B通信时,A要通过组织内部专门的通信手段询问大家,B是否是组织内部的人,当组织内部的大多数人(50%以上)都确认B是组织内部的人,此时A就认为B可以值得信任了。反过来说,如果B是内鬼,就必须整个组织的内鬼数量大于真实党员数量,才能欺骗A。此问题属于经典的拜占庭将军问题。
这种方案,是一个完全去中心化的解决方案,但是必须网络规模足够大,使得欺骗成本很高,才能保证安全性。
这三种方案各有优劣,且应用领域不同。方案一适合于节点规模小,且节点数量不会频繁变动的物联网场景。方案二对任意的物联网规模都适用,能够做到方案的通用性,而且能达到非常高的安全级别,但是依赖于一个云端中心节点,对中心节点的可靠性、性能、扩展性都有很高的要求。方案三是一个完全去中心化的解决方案,但是适用那种大规模网络的物联网应用场景。
本文的方案,是基于方案二来设计的。
方案设计
首先声明,该方案借鉴lorawan协议安全机制,以及Kerberos协议的思想,并充分考虑应用到物联网领域的工程可行性后进行重新设计的。
假设我们有这样一个物联网拓扑:物联网中两个节点A和B都在生产环节烧写好独立的AppKey:KA和KB,以及对应的设备ID:ID_A和ID_B,同时云端的密钥管理中心保存了节点A和节点B的AppKey以及对应的ID。
节点B首先用自己的应用密钥KB解密yB,得到
; 并用新得到的会话密钥Kses解密yAB,得到
。接下来的判断很重要:如果
,则能确认yAB和yB的合法性,因此能确认两件事情:1. yB是密钥管理中心发送的,里面包含的A、B之间会话密钥Kses是合法的;2. 自己确实是跟节点A通信。最后B保存生存期T。
至此,A、B双方都安全的得到了会话密钥Kses,并且双方确认了密钥的有效期T,在Kses到期前,A、B双方可以点对点的安全通信,而不需要中心节点的参与,极大的节省了云端性能的开销。
重放攻击
想象一下如下场景,如果一个黑客C抓取A和B之间的历史加密数据,并通过某种途径,得到了一个历史会话密钥
,他就可以伪装成A给B发送历史yAB和yB,由于节点资源有限,从工程角度B不可能把历史上所有的会话密钥记录下来,因此B根本无法知道这是历史会话密钥。如果没有生存期T的存在,B就会承认该密钥的有效性,从而与C建立了安全连接(想象一下如果B是某银行金库的大门开关),而有了生存期T,B如果发现密钥已经失效,则此次重放攻击不生效(极端情况下,密钥可能通信一次就失效)。
另一种重放攻击场景,是C伪装成密钥管理中心给A节点应答和,由于每次A节点会随机生成nonce rA,因此历史数据重放攻击在A节点对nonce的确认环节无法通过。
总结
这个方案的巧妙之处在于:
- 两个节点之间,只要有一个节点能连接云端即可,不要求双方都必须连接云端。
- 只有会话建立初期,需要云端参与协商密钥,后续通信不需要云端参与,大大节省了云端的性能开销。
- 由云端决定密钥生存期T,并且双方无法抵赖。而不是由其中某个节点决定。想象一下,如果生存期由某个节点决定,那么如果该节点是一个恶意节点,就可能把生存期设置成无限长,使该临时会话密钥无法失效。
- 同时生存期T的存在,也可以有效的防止重放攻击。
该方案可以作为一个基础协议,嵌入到不同的产品形态:节点、手机、网关、云端密钥管理中心等。不同的产品形态,在工程实现时可能有一些不同。例如,手机作为节点A,可能没有应用密钥,而是通过用户账户+TLS隧道的机制,跟云端建立安全隧道,因此密钥管理中心下发yA时,可以不用加密,手机端可以去掉解密环节。
其次,该方案独立于各种传输协议,比如手机和网关之间可能是蓝牙、Wi-Fi传输;手机和云端可能是4G移动网络;网关和节点之间是lora协议传输,均可采用此方案。
另外,根据不同应用领域的安全级别不同,做方案时,可以完全实现、部分实现、不实现该协议。比如防止重放攻击必须依赖系统时钟,在安全级别要求较低,系统资源要求较苛刻的解决方案,可以不实现防止重放攻击部分(会话密钥泄漏是一个小概率事件)。
作者:赵晗
原创方案,禁止转载
以上是关于一个eclipse里面如何建立两个互不影响的project, 如建立一个Cproject和一个javaproject?的主要内容,如果未能解决你的问题,请参考以下文章