切换到宽版
爱科技/爱创意/爱折腾/爱极致;技术知识分享平台,点击进入新版数码之家网站
  • 7022阅读
  • 31回复

[家电]DIY一个RFID门锁控制器 [复制链接]

上一主题 下一主题
离线江小g
 

发帖
559
M币
983
专家
15
粉丝
53
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2016-04-03
Esipode 1. 起源
宿舍经常有人忘了带钥匙,一旦没带钥匙就要跑去遥远的办公室去拿备用钥匙,很烦人。于是就有了DIY一个不用钥匙的开锁系统。
现在有的开锁系统有这么几种:
类型 优点 缺点
微信开锁 只要有手机就能开锁 需要使用路由器等设备访问互联网,成本较高
二维码开锁 只要有手机就能开锁 需要加摄像头,更麻烦,成本更高
指纹开锁 啥都不用就能开 更贵了
密码锁 成本低,只要1206/数码管+键盘就可 密码静态不安全,键盘外置易被破坏
蓝牙锁 有手机就行 开锁步骤繁琐
RFID锁 成本低,方便 ID易被复制


综合来说,RFID和密码锁是成本最低的,而且较为简易。
Esipode 2.方案一:全功能版本
这个版本目前已经弃坑,不愿意看的可以直接跳过这一节。
这个版本将RFID和密码锁结合,有效防止丢失一个而造成的安全漏洞。
基本模型:
  1. 单RFID识别
  2. 静态密码
  3. RFID+静态密码
  4. RFID+动态密码
  5. 动态密码

这个方案是可行的。

这里说一下动态密码的实现,动态密码通过TOTP算法进行生成。TOTP(基于时间的一次性密码算法)是支持时间作为动态因素基于HMAC一次性密码算法的扩展。

TOTP算法一共有四个变量:
  • 密钥K:这个密钥K是由服务端(就是门锁)和客户端(你的手机之类的)共享的,只要知道它就能算出动态密码
  • 当前时间T1:就是现在时间的UNIX时间戳。UNIX时间戳指的是自格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
  • 起始时间T0:在这个系统里面是0
  • 时间步长X:在这里是30秒


首先,我们要算出相对时间戳Time:
  1. Time = ( T1 - T0 ) / X
化简一下就是:
  1. Time = T1 / 30
接下来,我们要计算原始的动态密码:
  1. RAW_PASS = HMAC-SHA1 ( K , Time );
也就是把 相对时间戳(Time) 用 共享密钥(K) 进行HMAC-SHA1加密。
HMAC-SHA1加密:
DIY一个RFID门锁控制器
H:加密算法,这里是SHA-1算法
|| 意味着级联,例如 "233" || "450" 得到 “233450”
⊕ :异或运算
opad
是(0x5c5c5c…5c5c, 长度为64),
ipad
是 (0x363636…3636, 长度为64).
首先,把K用后面补0填充成一个64位长度的数
然后用K分别于opad和ipad进行异或运算,得到 ostr 和 istr
将istr用SHA-1算法进行加密,得到sha-istr。
将ostr sha-istr 和 m 进行级联,对级联后的字符串进行SHA-1算法加密,就得到了结果


我们得到了原始的动态密码,我们要对它进行缩短,以便输入:
  1. TOTP = Truncate(RAW_DATA);
缩短算法 Truncate:
  1. /**首先,我们知道,RAW_DATA的长度是20字节。
  2. 第一步,取得RAW_DATA 的最后一位的低四位为偏移量Offset:**/
  3. int offset = RAW_DATA[19] & 0x0f;
  4. //第二步,取得RAW_DATA从offset位开始的4位数
  5. int binary = ((RAW_DATA[offset] & 0x7f) << 24) //这里为什么是0x7f呢?为了防止不同的CPU得出不同的结果
  6.        | ((RAW_DATA[offset + 1] & 0xff) << 16)
  7.        | ((RAW_DATA[offset + 2] & 0xff) << 8)
  8.        | (RAW_DATA[offset + 3] & 0xff);
  9. //第三步,把得到的四位结果转换为整数,并且取后六位
  10. int result = (int)binary % (10^6);
  11. return result;
最终,我们得到了动态密码TOTP。
相应的,手机上只要安装了Google Authenticator(安卓/苹果)或者 验证器(Windows Phone) 就可以生成动态密码了。


Esipode 3.精简版本
上面那个太麻烦我懒得做233333
于是就有了这个精简版本。


这个精简版本只读卡号,与数据库进行比对。
主板:



背面图



RC522模块:


成品:


功能:
  • 当卡靠近的时候,读出卡号。如果卡号正确,则蜂鸣器响一声,并吸合继电器。
  • 如果卡号不正确,就响两声,不开门。
  • 按下按钮后,可以添加一张卡
  • 如果卡添加成功,响两声
  • 如果卡已经存在,则响三声


元件:
  • STC12C2052AD
  • RC522模块
  • 按键,晶振,蜂鸣器,继电器,二极管
  • AMS1117-3.3


线路图:



后记:
12C2052AD空间真小。。。好不容易才精简到可以放下这些东西。



源代码:
https://github.com/jiangming1399/RFID_Door_lock_mini


如果你觉得我写得好的话,麻烦给我赏点M吧。
也欢迎在Github Star 和 Fork 源代码,虽然写得不好就是了

[ 此帖被江小g在2016-04-05 12:36重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共19条打赏M币+60专家+1
12
离线alicescope

发帖
816
M币
938
专家
9
粉丝
28
只看该作者 1楼 发表于: 2016-04-03
请登录后查看
离线0720

发帖
4803
M币
5060
专家
83
粉丝
250
只看该作者 2楼 发表于: 2016-04-03
请登录后查看
离线s6069326

发帖
858
M币
1743
专家
2
粉丝
18
只看该作者 3楼 发表于: 2016-04-03
请登录后查看
离线hongo

发帖
53039
M币
149632
专家
275
粉丝
15184
只看该作者 4楼 发表于: 2016-04-04
请登录后查看
离线zheng156

发帖
5480
M币
4193
专家
4
粉丝
28
只看该作者 5楼 发表于: 2016-04-04
请登录后查看
离线1044438550

发帖
212
M币
212
专家
0
粉丝
5
只看该作者 6楼 发表于: 2016-04-04
请登录后查看
本帖最近打赏记录:共1条打赏M币+1
离线seekcheng

发帖
1863
M币
195
专家
1
粉丝
0
只看该作者 7楼 发表于: 2016-04-04
请登录后查看
离线wzg4315333

发帖
212
M币
431
专家
4
粉丝
12
只看该作者 8楼 发表于: 2016-04-04
请登录后查看
离线tadlikai
发帖
2
M币
-500
专家
0
粉丝
1
只看该作者 9楼 发表于: 2016-04-04
请登录后查看
快速回复
限80 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个