最近在实现Android系统的刷卡功能。
最简单的是磁卡,USB OTG插上就能用,它其实就类似一个键盘的输入,但是磁卡不方便,还容易消磁,安全性差;第二种是RFID卡(M1卡),优势明显,但是能支持Android的很少。
对于能配合Android的RFID刷卡器,目前商用的可能只有一款ACR122U(售价¥200~300),如果需要更廉价的方式,也可以考虑Android+Arduino+RFID模块(成本大概100)。
下面就以ACR122U为例简单介绍下系统集成过程:(首先到http://www.acs.com.hk/下载一份SDK)
(1)发卡与注册:
每张M1卡号称都有一个全球唯一的UID,但似乎现在UID也能够被复制,因此我们还需要考虑加密。最简单的加密方式就是写key了,可以通过ACS工具包“TOL_ScriptingTool_ACR122”、“Key Management”操作(通过APDU方式鉴权/修改key);
一般来说,注册的时候只需要将UID和用户信息绑定存入网络服务器数据库中即可,M1除了写key并不需要写其他数据。当然也可以自己写一个批量加密的应用,并往里面加一些校验数据,然后锁定该块。
(2)刷卡与登录:
Android系统首先需要支持USB HOST MODE才能支持刷卡器。连接刷卡器后,导入ACS for Android的sample项目,然后通过APDU的方式与M1卡进行交互。刷卡时首先获取UID,然后用key进行鉴权,成功后再通过服务器进行用户登录操作。
(3)挂失与注销:
挂失和注销就是在服务器中给UID对于的用户就行操作。
更加安全的方式:
(1)据称M1卡(14443)已经被破解,如果涉及大额的消费,更安全的CPU卡可能是更好的方案。
(2)对于加密key,如果要做到更高的安全性,
- 应该用C语言代码来做写key而不是脚本;
- Android中验证部分也应该用jni实现;
- key的值应该以UID作为种子,通过MD5加密方式生成;
- 同时可结合服务器进行双重验证,每次修改随机数。