IOT设备的鉴权与绑定

    绑定,是为了让用户和设备之间建立联系,从而只有这个用户有权限对设备进行控制,使用。

    鉴权,是为了验证设备的真实性。鉴权实际上主要是云端对设备端进行鉴权,避免有人冒充设备,发送假数据给云端,从而让用户把假设备当作真设备使用。

    为什么要将绑定和鉴权放在一起说呢,因为我觉得这两个功能实际上是相互关联的。实际上设备与云平台的任意一次交互,云平台都需要直接或者间接的验证下面的几条内容:

    1.与我通信的设备是不是我们生产的设备

    2.与我通信的设备是不是用户合法绑定的设备

    3.我收到的数据有没有被修改过

    其实在做流程的时候,我们要一直做这样的假设:我们防范的不是其他人,而是我们自己的工程师。如果有一天我们的工程师离职了,他们会怎么做。如果我们的工程师带走的关键数据,他们会怎么使用。

一.是不是我们生产的设备

    这一步通常在绑定的时候会进行验证。如果设备是被clone或山寨出来的,云平台是不会允许他们与用户进行绑定的。

    IOT在设备生产的过程中,总是需要烧写一些内容在flash中,来让设备证明自己的唯一与真实。通常情况下,云平台会为设备分配“设备ID”与“设备密钥”。

    设备ID代表了设备的唯一性,通常会使用MAC地址,或一些唯一的字符串(MODEL+比如MAC地址经过md5签名后=MODEL+12345678)。无论使用哪种方式,设备ID在整个云平台内,都是唯一的。云平台通常有一个专门的数据库,用来存放已经生产的设备ID。只要提供设备ID,通常云平台就可以查询到这个设备的所有信息。

    设备密钥代表了设备的真实性。设备密钥就像设备的指纹,只有设备自己会随身携带,云端通常也会有一份对应的密钥。设备在需要的时候,可以用指纹进行解锁后,和云端进行通信。

    这里我提到云端有一份对应的密钥,而不是与设备密钥相同的备份。这其实与设备的密钥使用方法有关。通常情况下,设备密钥有以下几种使用方式:

    1.设备端的密钥与云端的密钥相同。这个是我们最容易理解的,毕竟双方有着相同的钥匙,无论是加密解密,还是进行带密钥的签名,都是可以很容易进行相互确认的。缺点就是这个密钥有可能由于被云端泄漏,而造成大面积的损失。因为云端通常需要保存一份设备密钥与设备ID的对应关系,因此这个数据库实际上需要很强的保密性,一般人不能随意接触到。同时这种方案需要设计特殊的生产流程,在生产的过程中,设备ID与设备KEY的对应关系,理论上是不可以被明文存储或保存的。

    2.设备端存储私钥,云端存储公钥。这样的方案的好处是,云端即使泄漏了公钥,设备的真实性依然无法被复制,因为设备的私钥只有这台设备携带,任何地方都没有备份。在生产的过程中,通常需要在设备内生成私钥与公钥对,同时将公钥导出。私钥需要尽可能少的走动,最好仅在且永远在这台设备内。

    3.设备端存储公钥,云端存储公钥私钥。目前见过有厂家使用这样的方法,但是为何这样使用,个人感觉可能和他们工厂公钥私钥的生成方法有关。而且云端同时存储公钥私钥的做法(可能也存储了设备ID),增加了云端数据泄漏时的影响范围。

    这里不得不强调一下公钥私钥的使用方法。虽然公钥私钥可以相互配合进行加密解密,但是更重要的一点是,在使用过程中,通常公钥都用来加密密和验证签名,而私钥用来解密和生成签名。也就是说,私钥是私钥持有者身份的证明,所以与我通信的人,都需要用我的公钥进行加密,因为只有我有私钥可以解密;我可以用我的私钥对摘要做签名,因为有所持有我公钥的人,都可以通过公钥验证我的签名。

    如果想要保证数据的机密性,我们常见的做法是,通信双方通过非对称加密安全交换对称加密的密钥,后续通信过程的数据都使用对称加密保证数据机密性。

     当使用对称密钥方案的时候,设备端可以将一个加了salt的字符串,使用密钥进行hmac签名。云端拿到这个salt后,同样进行hmac签名后进行对比。

    如果使用非对称密钥方案,设备端也可以将一个加了salt的字符串,使用私钥进行RSA签名(JWT)。云端拿到这个明文与签名后,使用公钥进行签名验证。

    需要注意的是,无论使用加密还是非加密,验证设备密钥的方法都是签名,而不是加密。因为签名是不可逆的,无法通过签名获取明文内容。

我们需要遵循一种最简单的密钥生成原则:

    密钥的存储是不可靠的,我们要时刻认为,设备端的密钥是可以被轻易读出来的。

    这两个原则也就引出了接下来的问题,如果设备端的密钥被轻易获取了,我们如何保证设备的安全呢?

二.是不是用户合法绑定的设备

    这一节的内容用来解释上一节中最后的问题。如果设备端的密钥被轻易获取了,我们能不能保证用户的设备不受影响呢?答案是不能。

    很简单,设备端的密钥被获取了,也就代表着这个设备可以被clone出来,可以做到与真正的设备一模一样,或者说这就是一个真实的设备,可以做一切真实设备可以做的事情,除了还原与原用户进行绑定关系

    设备在使用前通常会由用户进行绑定操作。这个操作通常需要一些物理操作,或者需要用户与设备的距离非常近,才可以进行。因此,这样的绑定操作通常是无法被轻易破解与重放的。

   我们在最初讨论绑定原则的时候,提出了如下建议,这些建议也称为后期指导我们所有鉴权的基础:

    1.绑定后需要生成一个token,这个token需要由云端与设备端共同生成,且整个生成过程中需要保证流程的加密。

    2.token的生成,需要有设备端key的参与,并由云端对token“加盐”(由云端增加随机性)。token的生成不可逆,不要直接使用加密解密。例如token=MD5(设备密钥+云端随机数)。

    3.生成的token是绑定后云端验证设备合法性验证的唯一标准。token不可直接被用来传输。

    这样一来,我们将用户的绑定动作(不可重现不可逆),作为一个参数加入到鉴权的过程中。对于绑定后设备的鉴权,不仅需要对设备的key鉴权,更需要对绑定关系进行鉴权。设备的key存储在flash中不会改变,绑定关系却会随着绑定发生变化。 

    为什么强调对绑定关系进行鉴权呢?假如我购买了一台设备,读取设备key后再退货,实际上我是可以完全clone这样一台设备来的。仅clone设备的用途并不大,但是如果我能用这台加设备的信息,连接到真实的设备上(例如获取音视频传输的权限),才是真的可怕。  

    实际上我们在考虑绑定鉴权的过程中,本着这样的一个原则:我们防范的不是仅仅外面的黑客,更是我们本身的开发人员。如果由开发人员离职了,对我们设备的安全性会不会存在威胁?  

三.这个设备的通信数据有没有问题

    前面两个问题都是为了这个问题做铺垫。我们给设备颁发“身份证”,给设备与用户颁发“结婚证”,实际上都是为了一个目的:让云端知道正在和自己通信的设备,是不是用户正在使用的那台设备。

    IOT设备的通信通常氛围两种,一种是MQTT/AWSIOT等基于长链接的通信,另一种则是http/https等云端请求。MQTT/AWSIOT等一套自己的鉴权方式,通常是设备端持有公钥/私钥,用于与云端进行双向认证。这里不做详述。对于http等通信方案,我们应该怎样设计呢?

    有了前两个问题的铺垫,我们自然而然的得出了下面的方案:

    1.不使用http,必须使用https,保证数据报文的加密性。

    2.对http的body进行签名,签名要放到header中供云端进行验证。这样保证了签名无法用于其他的报文。

    3.http的body中最好带有时间戳,这样云端可以通过验证时间戳防止重放

    4.最好对http的body进行加密。毕竟通过代理,可以很容易的截取到https的报文内容,尽管https本身存在加密。

    实现了上述四点,基本上可以在保证报文安全的情况下,让云端对报文的发送者进行鉴权,确保了报文的数据是合法的,唯一的。

云端如何验证设备真实性

云端验证设备的真实性,实际上验证的是设备端存储的那个密钥。无论是使用相同的密钥,还是使用公钥私钥的形式,我们都希望能够在不暴露密钥本身的情况下,让云端对密钥进行验证

    那么,我们应该如何来验证一个密钥呢?

    方案一:把密钥通过https传输给云端。实际上无论是放在https的header中,还是放在body中,这种传输方法都是错误的。攻击者实际上只要通过一个代理,就很容易解析出https中的内容。特别是在有的开发者故意不使用https的情况下。

    方案二:通过加密的方法,将加密后的字符串作为token传输给云端进行验证过。这样做确实比方案一隐蔽了一些,但是需要注意的是,加密是一种可逆的操作。也就是说攻击者一旦掌握了你加密的方法,就有可能通过收集大量http请求的报文内容,通过暴力破解的方式,将你的key试出来。

    方案三:通过签名的方法,使用key作为密钥,对一些内容进行签名。签名后的内容是不可逆的,因此破解的难度相对方案二来说更大一些。无论是使用私钥签名,还是使用hmac签名,安全性相较前两个方案都更高一些。

    通过上面两个方面的描述,我们可以清楚的知道,验证设备的合法性,实际上验证的就是设备所包含的一个密钥。无论这个密钥是存储在flash中,还是每次启动生成在缓存中,亦或是存储在安全加密的flash中,这个密钥最终都会被云端进行验证。

四.还有什么其他的方案?

    在工作中和友商们接触的多了,通常也可以看到很多各种各样的方案,这里挑一些有意思的和大家分享下:

    1.设备存公钥,云端存私钥。

        这个方案实际上是可以用的,但是友商的小伙伴似乎搞混了公钥私钥的用法。在使用的过程中,公钥和私钥仅用于加密和解密。实际上,公钥和私钥之所以不同,原因是他们一个用于加密,一个用于签名。可能是为了避免设备端和云端存储相同的密钥吧,但是这样公钥和私钥的用法,实际上也并不规范。另外,破解公钥的难度要比私钥小的多,设备端存储公钥,可能仅仅是为了保证端云持有不同的密钥吧。

    2.绑定关系token可以更换。

        绑定时生成的token可以更换,这个本身没有什么问题,但是需要注意的是更换的过程。但后来发现友商的小伙伴在更换的过程中,仅使用设备端密钥即可对设备端持有的token进行更换,一旦设备的key被泄漏,这个设备变成了一台可以随时被控制的设备,无论怎样操作,都将是一台不再安全的设备了。

    3.设备端存储IOT证书。

        设备端存储密钥是正常的,但是设备端存储IOT证书,实际上是十分危险的。在生产的时候倒入IOT证书,也意味这这个IOT证书无法被更换。一旦IOT证书被泄漏,这个设备的IOT通道就可以随时被进行访问。通常我们的建议是,IOT证书应在设备绑定后,从云端获取,且设备每次获取的IOT证书都需要被重新颁布,不可以一直不变。

    4.只要我们的开发人员不泄漏设备的关键信息,设备就是安全的。

        所谓防御往往是从内部被攻克的,如果逻辑本身存在漏洞,我们不能把希望寄托于开发人员自身的职业素质。况且想要获取设备的逻辑,也有这各种个样的方法。我们要做的,就是将设备的逻辑完善起来(注意不是复杂,是完善),将开发人员本身作为防范的对象,来构建我们的安全逻辑。如果固件开发工程师离职了,我们的设备是否安全?如果固件开发工程师和云端开发工程师一起离职了,我们的设备是否安全?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 在物联网IOT平台设备接入到云端设备安全和数据安全置关重要,目前比较大型的IOT云平台,比如亚马逊,微软,阿里,腾...
    乱七八糟谈技术阅读 761评论 0 1
  • 夜莺2517阅读 127,709评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 6,876评论 1 6
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53
  • 兔子虽然是枚小硕 但学校的硕士四人寝不够 就被分到了博士楼里 两人一间 在学校的最西边 靠山 兔子的室友身体不好 ...
    待业的兔子阅读 2,583评论 2 9