本文主要记录一下对身份证加密芯片和SAM密码模块的相关资料搜索过程,并(尽量)总结归纳一下搜索中的一些经验。
注:本人未曾参与过身份证相关研发工作,文中内容全部来自于互联网公开信息
每当我因为办事需要用到身份证时,就会看着卡片上自己英俊的照片陷入沉思:这张小小的身份证是如何证明我的身份的?经过简单的查询可以知道身份证里面有一张芯片,通过一些密码学的黑魔法可以读取和校验个人信息,仅此而已。这对于喜欢刨根问底的人而言显然不是一个满意的回答,因此在一个无聊的周末,我决定尝试认真研究一下,看看自己能挖得多深。在解决这单个无聊问题的同时,也让我对网络信息查询有了一点新的体会,不愿藏拙一并分享给大家。
要说搜索信息,我们第一个想到的肯定是百度,毕竟这是“最懂中国人的搜索引擎”。但事实上搜索技术发展到现在,各个搜索引擎的索引结果其实都大同小异,甚至一些国外的搜索引擎对于中文也有了比较高质量的搜索结果,比如Google、Bing、Yandex等等,而对于英文信息的搜索,无疑也是国际化的搜索引擎更胜一筹。
因为我们搜索的是中国的二代身份证芯片信息,所以还是选择中文搜索引擎,首先在百度中搜索关键字身份证芯片
:
说实话,信息比我想象的要多。其实第一次搜索的目的主要是筛选关键字,并根据关键字进行下一步的精细搜索,通过百度上的内容我们可以得知的信息有:
通过深度优先算法逐一查看这些搜索结果,并没有太多的额外内容,但是得知了解密模块的昵称为SAM模块,全称猜测是Security Authentication Module之类。在一些电子论坛中可以看到有相关行业人员的一些讨论,SAM模块由公安部提供,分为两种型号:
说到具体有哪些信息,搜索中也遇到了一些语焉不详故作神秘的回答:
不能回答不要浪费我流量,OK?
总而言之,第一步的目的已经基本达到,我们获取了一些关键词:加密芯片、SAM模块等等,接下来就需要用这些关键词去进行下一步的搜索。值得一提的是,大部分问题是否能找到想要的回答,更多是取决于你是否Ask The Right Question,即是否问到了点上,模糊查询的目的就是找出这些点。
通过身份证SAM模块和加密芯片的关键字,我进行了第二轮的搜索,这次找到了一些其他内容:
已经从小白式的问答逐渐转入了圈子内(开发者)的问答,这是个问对问题的好迹象。同样阅读这些搜索结果,我们得知身份证读卡模块有很多厂商在生产和销售,点进其中一个厂商的网站查看对应产品的信息,可以看到读卡模块长这样:
根据我粗浅的电路知识可以知道的是,右边为IC读卡线圈,将读取的IC芯片信息传输到左边的板子中进行解密,解密后的信息通过USB再读取到电脑或者其他设备中进行存储和进一步验证。
左边的电路板似乎就是我们要找的SAM模块,但仔细一想,功能单一的密码模块不可能这么庞大,所以这只是集成了密码模块的的一个完整系统,SAM模块只是其中的一部分(视力好的同学可以看看是哪个部分)。
在论坛和厂商的文档中,我们至少可以知道身份证芯片中所包含的内容包括姓名、民族、出生年月、照片等卡片上本来就有的信息,以及指纹信息。其中指纹信息解密后并不是常规的bitmap,而是特殊的特征信息,指纹特征比对算法是由公安部认证的算法提供商所提供的。
上面这些信息,其实更多的是一些“道听途说”的内容,出于严谨的考虑,还是希望能找到出处。因此,这一步的搜索就需要进一步限定范围。其实如果是公开信息,那么这些信息一般都会在国家标准中找到出处,现在假设我还不知道这点,就先用传统搜索方法,在公开论文中查找。
论文一般是别人花费心思的研究成果,因此查找论文的好处是可以尽可能保证信息的准确性,并在此基础上通过论文中的引用文献进一步确定我们需要寻找的方向。另外通过阅读高质量的论文对于我们快速了解一个领域也是很有帮助的,一个小技巧是在论文搜索中使用关键字+综述
(英文论文则是关键字+survey
)的查找方式,通过几篇论文就能大概知道特定领域的过去、现在以及未来发展。
回到身份证的问题上,搜索到的相关论文有:
阅读理解后可以知道二代身份证系统主要分为两个部分,一个是制卡发证系统,另外一个是社会应用系统,前者主要由公安部直接进行管理和协调,后者则在一定程度上开放给各个厂商。制卡发证系统主要是将用户信息通过公安部私钥进行加密并写入身份证芯片中,写入后无法修改(ROM或者写入后烧断熔丝)。社会应用就是上面提到的身份证阅读器生态,主要是使用公安部预置公钥的安全密码模块对身份证芯片中读取的信息进行解密和校验。
身份证信息的读取在物理层上和其他IC卡(银行卡、公交卡、饭卡)类似,都是通过读卡器发送射频信号触发IC卡的电路从而进行数据交互,因此不多展开,重点是其中特有的安全认证过程。在上述论文的引用文献中,发现了一个官方的标准文档——GA 467—2013
:
该标准由公安部一所、公安部居民身份证秘钥管理中心和数据通信科学技术研究所联合起草,定义了身份证安全控制模块接口、信号时序、传输协议以及操作命令。其中定义的安全模块名称为SAM_A(Secure Access Module for Authentication),即验证安全控制模块,从而订正了我们前面对SAM的错误缩写。值得一提的是,在该标准的前一版(2004版)中,安全模块的缩写为SAM_V,这也是很多厂商惯用的叫法。
SAM模块的内部实现是非公开的,因此我们就从接口本身去看。SAM模块的一方面通过射频模块接口与身份证IC卡通信,另一方面通过串口UART或者USB接口与业务终端进行通信。业务终端传输到SAM模块的命令分为两个部分,分别是命令码(CMD)和命令参数(Para),各为1字节,一共有10个命令码,如下表所示:
SAM模块返回给业务终端的响应使用状态字(SW)表示,一共有3个状态字和一个帧数据内容(Data)段,分别表示返回结果以及返回的数据内容。
面向身份证IC卡的射频部分同样指定了读写协议,值得重点提一下的是SAM模块对于和身份证IC卡的交互中定义了精确的时序范围。为什么说这个呢?因为曾经出现过的一种方案就是使用手机作为读卡器,并将读取的IC卡裸数据转发到云端的SAM模块去解密,这样可以少买一点SAM模块。……不过这种方案对于网络延时是相当敏感的,根据标准中的定义很可能导致操作超时。
因此我想要了解的信息就基本满足了,在查找资料的过程中,通过对这些国标的交叉查阅,发现了另外关于身份证各个方面的详细定义,包括证件的UI布局、证件号码的格式与校验,还顺便找到了上面那个故作神秘的知乎回答(身份证芯片中保存的是什么信息)的真正答案:
出自《GA448—2013 居民身份证总体技术要求》
更进一步,我还顺便找到了身份证芯片中每个字段的内容含义以及存储空间大小:
数据项 | 字节数 | 备注 |
---|---|---|
姓名 | 30 | |
性别代码 | 2 | GB/T 2261.1 |
民族代码 | 2 | GB/T 3304 |
出生日期 | 16 | 格式为YYYYMMDD |
住址 | 70 | |
公民身份证号码 | 36 | GB 11643 |
签发机关 | 30 | |
有效期起始日期 | 16 | GA/T 2000.16 |
有效期截止日期 | 16 | 同上 |
reserve | 36 | 预留区 |
相片信息 | 1024 | 以二进制存储的WLT格式文件 |
指纹1 | 512 | 第一枚指纹特征数据 |
指纹2 | 512 | 第二枚指纹特征数据 |
追加住址1 | 70 | |
追加住址2 | 70 | |
追加住址3 | 70 | |
追加住址4 | 70 | |
电路序号 | 8 | |
证卡序号 | 16 |
出自《居民身份证机读信息规范》
一开始对身份证芯片的疑惑现在已经基本解决,只剩下目前暂未公开的身份证芯片和SAM模块的内部实现。这部分有机会的话会进行进一步的逆向和研究,比如读取SAM芯片的固件进行分析,不过这就是不可说的部分了。
身份证的“秘密”本身并不是太过需要关注的重点,重点是挖掘秘密的过程。现代互联网中信息繁多且良莠不齐,再加上各种内容农场疯狂霸占搜索引擎的首页,如何在其中找到真正需要的信息其实对网民也是一种挑战。信息搜索说难不难,说简单也不简单,关键是要在正确的地方问到正确的问题。问问题的学问很多其他文章已经有介绍过了,问出正确的问题是需要有一定先验积累的,如果无法理解问题,又怎么能理解回答呢?
另外在正确的地方提问也十分重要,比如编程问题上stackoverflow,了解专业领域到专门的论文平台搜索等,国内的有知网、百度学术,国外的论文可以上arxiv.org找。而对于某些工业、设计上的问题,比如本文提及的身份证芯片,一般会有专门的标准文档进行介绍。
各类标准按照不同的行业和领域有自己的前缀,比如GB、GA、GM等等,分散在不同的标准网站中,其中政府的官方网站做了一个比较完整的聚合,可以查询各类标准的标题,具体标准还是要到具体的网站中搜索。
GB为国家标准:
GA为公共安全行业标准,由公安部归口管理:
GM为密码行业标准,目前由国家密码管理局(国家商用密码管理办公室)归口管理:
其他各个行业的标准,可以参考知乎中行业标准文本查询下载方法的总结,毕竟标准文本的查询和加载也是个可以在网上找到答案的开放问题,这里就不再赘述了。