Mifare 是最常用的射頻卡,具體介紹網上太多,我就不說了.,很多城市的最早的地鐵公交卡都是用這種卡,后來被破解后都換成智能卡了.
但是由於技術成熟,使用方便,成本低,現在很多小區門禁卡,停車卡,食堂飯卡,包括很多醫院的就診卡都用的這種卡.
簡單介紹下,一張卡就好像一張白紙,S50有16個分區,每一個分區可以設置單獨的兩個密碼KeyA和KeyB. 而KeyA是永遠不能讀的, KeyB在默認情況下是可以讀到的.
.(簡單可以這樣理解, 注意,每個扇區可以設置KeyA和KeyB獨立的訪問條件)
而分區1比較特殊,分區1的第一段寫着卡的硬件ID,這個是出廠時就寫進去了,不能更改,並且全球唯一(當然這只是約定). 淘寶上有UID白卡, 這種卡可以給分區1寫入任意的硬件ID.
08年的時候,發現卡漏洞,這種卡已經很容易被破解, 網上買個讀卡器 ACCR122U (一百多)就可以破解.
大概的破解原理是因為這種卡不能產生隨機數.而用上位機控制隨機數的產生來破解..
但是如果是全扇區加密的卡(就是16個分區都加密) ,那么需要使用Proxmark破解,淘寶居然二三百..
推薦軟件 (mifare classic tool) 這個軟件使用Android也可以破解, 使用的是窮舉方式.
https://github.com/ikarus23/MifareClassicTool
問題: 既然這種卡已經被破解,也就是寫什么別人也能看得到,但是我們還必須用這種卡,那么我們如何存儲數據並且防止被破解?
設計要求:
我們是一家連鎖店,,使用mifare卡作為用戶標識卡...
1, 防止更改卡內數據(如卡號,信息等)
2, 防止卡被復制.
3,防止第三方制作卡(我們的系統以后可能會有加盟商,不能讓加盟商自己私自買新卡用我們的系統.,需要通過我們這里制作.)
4,保證穩定,快速的讀取,並且易於量產加密重置等.(需要單獨寫一個卡批量加密工具,用於量產.)
網上大都是Mifare的介紹或者如何破解等...不知道別人是如何設計的...
所以在這里寫一下自己的思路..
卡內只保存卡號, 不保存任何金額等其他信息.要求與實體卡上印的卡號一致.
將卡號加密后,存儲到指定分區M中,並且設置分區密碼為固定密碼 MA 和 MB..
根據卡號(+硬件ID) 生成對應卡號的校驗數據K.(或者根據算法生成).
使用固定密碼 NA 作為密匙A,
讀取卡硬件ID,使用加密算法 Fun(ID) 計算出16位密碼NB.
將校驗數據K存入分區N中,並且使用NA和NB作為分區密碼..
將其他分區使用固定的密碼全部填入隨機的垃圾數據,
寫卡完成..
讀卡時,只使用密碼B讀取,(只給客戶端下發KeyB的密碼,更安全.)
使用密碼MB讀取分區M ,獲取卡號,
讀取硬件ID,計算校驗分區N的密碼NB.讀取校驗信息.
(根據情況操作,可在客戶端確認,如何客戶端不可信,需要在服務端確認..)獲取校驗信息,通過服務端確認卡校驗信息是否有效,或者通過服務端解密卡ID..
總結:
雖軟卡硬件被破解了,寫什么都看得見..當然完全可以通過軟件算法來防止卡被進一步破解更改數據...
卡上寫的信息越少越安全,只在卡上寫卡號,不儲存用戶信息金額等.
當然校驗信息需要和校驗每張卡獨有的硬件ID綁定.來防止卡被復制..
但是網上有可寫UID的白卡,就是可以在不破解算法的情況下完全復制..(我們小區的門禁卡我就復制了好幾張,不然去物業辦一張十塊.)
這個時候只能人為的控制,比如消費或者退卡的時候,前台需要確認卡上的標識,或者確認人員信息等.
(有的醫院退卡需要繳費清單)
這個用了不到兩個星期來設計並完成.目前已經穩定工作了兩年,寫了大概十幾萬張卡..
中途碰到過公司采購一批小廠商生產的垃圾卡,上萬張卡的KeyB壞掉了,不能讀取..只能通過改程序來兼容..
寫出來做個筆記, 只是不曉得別人是怎么設計的....