aqara门锁一次性密码瞎捣鼓

最近家里装了个aqara的智能门锁,发现有个一次性密码,无需联网无需手机连接就可以直接生成一次性密码,简直amazing!(其实一点不amazing,盲猜HOTP或者TOTP,类似于谷歌的authenticator)

HOTP和TOTP

  • 首先简单说下HOTP和TOTP,简单理解就俩密码生成算法,事先约定好一个密钥,然后客户端服务端用相同规则来计算,就能得到一致的值了。
  • 其中HOTP是根据计数,即密码生成次数,比如客户端第一次生成密钥那就是 密钥+次数通过某算法运算即可得到一个密码,服务器使用同样运算就可以了。至于客户端多生成了几次,次数和服务端对不上怎么办?服务端可以重试!!
  • 至于TOTP是根据时间,即密钥加时间来计算,比如以30s为一个周期,按30s取整加上密钥就可以计算出一个密钥,服务端可以使用同样的算法进行计算。至于时间不准咋办,时间不准那就前后几个周期都算一下,至于差的太多的,那就自己调时间吧。以前很多银行的什么什么盾应该用的就是这种。

具体详细的介绍可以看这篇文章(HOTP和TOTP算法图解)

aqara门锁一次性密码分析

现在我们来看这个锁的一次性密码


一次性密钥.jpeg

首先,上面这张图可以看到生成的密码的特征
- 6位数
- 一段时间内有效
- 还有一点这张图可能没法显示,就是它在这个时间段内多次生成,可以生成不同的密码

这问题就来了几位数暂时不看,首先一段周期内有效,很像TOTP算法,但第三点这个周期内可以生成很多个不同的密码,这就大条了,TOTP算法理论上在指定的周期内生成的密码是一致的,不然服务端就没法校验了。不过这点倒是和HOTP可以对得上。
所以?我觉得一种可能方式是通过HOTP+TOTP共同来实现!

下面说具体逻辑
首先再来梳理一下

  • 这个一次性密钥有效时间是往后20分钟然后向下取整
  • 周期内可以生成多个不同的密钥
  • 开锁一次后即失效

第三点开锁一次就失效完全可以记录下来这个密钥被使用过,至于存到ram还是rom暂时不知道,下次拔电池试试,不过这不重要,重点看前两点。

举个例子:假设现在是晚上23:06,那么我现在生成一个一次性密钥,有效时间就是到23:20,我们可以取23:00整的时间戳,加上密钥通过某算法运算得到一个密钥。
现在我有了一个密钥,有效期到23:20,我要去开锁,假设我开锁的时候已经是23:11分,那么门锁端怎么校验呢?首先一样的逻辑,往前取整到23:10分,取23:10分的密钥,使用TOTP算法算出密钥,这时候密钥必定不对,因为我们生成的密钥是使用23:00这个时间点的时间戳来生成的;门锁发现匹配不上,那么就再往前取整到23:00,这时候就可以算出一致的密钥,密钥校验通过。

下面再来解决多次的问题,关键的一张图来了!嘿嘿!!!

周期内最多创建8个一次性密钥.jpeg

这张图可以看出来每个时间段最多只能生成8个一次性密码,那就好办了,我们在原有的TOTP算法基础上再加上次数即 现在是 密钥+时间戳+次数 通过某算法即可得到一次性密码,门锁校验时候也可以在上文的基础上加上次数,所以也就是时间准确的情况下门锁理论最多尝试16次即可确定你输入的密码到底是对还是不对。这个计算次数我猜对于嵌入式设备应该是可接受的,因为这个完全可以使用一些相对简单的算法比如md5,毕竟这个只是生成密钥,并不是加密。

最后关于时间我发现手机上生成这个一次性密钥是需要联网的!!!!
抓包如下图


一次性密钥生成过程抓包.png

第一个请求,报文挺复杂,没整明白,不过不重要,看名字应该是获取utc时间的,这样就可以规避手机终端时间不准确的问题,第二个请求我也不知道干啥用的。

至此,由aqara这个智能锁的一次性密钥所引起的一些想法就告一段落,虽然我说的未必就真的是这款锁一次性密钥的实现方式,但我想说的重点还是HOTP和TOTP这两种算法。挺好玩的两种算法,实际开发中遇到一些需要较高安全性的校验也可以使用一下。

你可能感兴趣的:(aqara门锁一次性密码瞎捣鼓)