智能卡安全机制比较系列(一)CardOS
自从智能卡开始进入人们的日常生活之后,大家对于智能卡的安全性普遍看好,但是不同公司的智能卡在安全机制的实现方面也存在很多的差异。对于智能卡应用开发和智能卡COS设计人员来说,如果能够更多地了解不同公司的智能卡安全机制,无疑会对自己的开发过程有所帮助。在此将逐步介绍一些流行的智能卡操作系统中各具特色的安全机制,究竟这些安全机制孰优孰劣,其实无关紧要,只要这种安全机制能够满足系统的安全需求就足够了。
首先看看早期的CardOS,CardOS是西门子公司基于自己的44C40/80系列芯片而设计的,该系列芯片RAM大小256字节,程序空间8K/16K,数据空间4K/8K,采用西门子的8051内核。CardOS在1995年推出了1.2版本,主要的APDU命令是符合ISO7816-4的文件读写操作,采用的安全机制非常灵活,初看起来也有点复杂,但是实际原理却是比较简单的。虽然目前国内市场上几乎已经没有什么CardOS产品了,但是了解这个初期的鼻祖级的智能卡安全机制,对于了解目前市场上流行的COS安全机制应该会有些帮助。
CardOS采用半字节作为安全状态,除却0和F之外,还有1到E共计14种状态,每个状态分别对应要达到该状态需要进行的某种安全认证操作以及这些认证的不同组合方式,这些安全认证包括校验PIN或者是C/R (Challenge / Response) 认证(也就是我们现在通常所说的外部认证),而认证的组合方式包括“逻辑与”及“逻辑或”。
对于文件的操作和密钥的使用可以定义不同的安全状态,只有满足定义的安全状态后才能进行相应的文件操作,或者密钥的使用。无论是DF还是EF都有一组3字节的安全状态控制字,每半字节作为一种访问控制的状态标识,分别对应着文件的建立、删除、添加、读取、更新等操作。
这些安全状态及其需要的认证或组合全部保存在一个特殊的内部文件STCF(Security Test Control File)安全认证控制文件中,该文件是一个TLV(Tag Length Value)结构的记录文件,其中第一个字节就是1-E这14个状态中的一个作为TAG,Length根据认证方式的不同而存在差别,Value当中的第一个字节表示认证类型,从中可以看出这个认证是需要PIN认证,还是需要C/R认证,或者是某几个认证状态的“逻辑与”及“逻辑或”组合。对于PIN认证还可以指出应该使用哪个PIN文件中的哪个PIN,同样对于C/R认证也可以指出应该使用哪个密钥文件中的哪个密钥。在CardOS的系统中有一个安全状态bit mask标志,用不同的数据位来记录哪个安全状态经过认证得到了满足。在有些情况下,进行DF选择之后,当前DF的认证状态的bit mask标志将会被清空。
关于“逻辑与”和“逻辑或”其实也很简单。比如“03”的状态表示认证第3个PIN文件中的第2个PIN,“0B”的状态表示需要对第1个密钥文件的第5条密钥进行C/R认证。那么我们可以定义状态“06”表示“03”和“0B”的逻辑或组合,定义状态“07”表示“03”和“0B”的逻辑与组合。我们假设有两个文件EF01和EF02,其中EF01读写的安全状态分别为“03”和“06”,EF02读写的安全状态分别为“0B”和“07”。那么在验证了第3个PIN文件中的第2个PIN后,即可以读EF01也可以写EF01,而对于第一个密钥文件的第5条密钥经过C/R认证后,也可以写EF01。对于EF02的写操作必须同时满足以上两个认证状态,对于EF02的读则只需要C/R认证第1个密钥文件的第5条密钥即可。
除了以上的安全状态控制机制之外,CardOS还定义了所谓的线路保护LINE PROTECTION,在文件的创建过程中会定义LPROTF字段,作为线路保护属性,有两种线路保护模式分别为MAC方式和加密方式,同时还定义了线路保护的方向,即从卡到终端以及从终端到卡。而用来进行线路保护的密钥只能存储在SKF(System Key File)系统密钥文件中。
在CardOS中定义了几个默认的EF文件标识,分别为:0000 = ATR二进制文件,0001 = STCF记录文件,0002 = PIN记录文件,0003 = SKF系统密钥记录文件,0004 = RSF 随机数种子二进制文件。CardOS支持最多6层DF文件结构,可以通过文件名、文件标识、文件路径等方式进行文件的选择。
智能卡安全机制比较系列(一)CardOS的更多相关文章
- 智能卡安全机制比较系列(二)DS SmartCard
DS Smart Card是飞利浦公司自己开发的一款CPU卡产品,在早期芯片厂商开发自己的COS并进行推广很普遍,现在像英飞凌(前西门子半导体)以及恩智普(前飞利浦半导体)几乎很少推广自己的COS,大 ...
- 智能卡安全机制比较系列(六) TimeCOS
TimeCOS是握奇公司推出的智能卡操作系统,也可以说是国内早期自己开发的为数不多的几款COS之一.当然随着后来国内公司对于CPU卡开发的投入,其他公司的COS产品也纷纷推出. 其实从握奇的TimeC ...
- 智能卡安全机制比较系列(五) StarCOS
StarCOS是捷德公司的推出的智能卡COS,和前面说过的几种COS不同的是,国内的用户对于StartCOS可以说非常熟悉,而且因为握奇.明华.天喻等公司的安全机制都基本上是脱胎于StarCOS,所以 ...
- 智能卡安全机制比较系列(三) MPCOS
MPCOS是金普斯早期推出的一款多应用支付芯片卡操作系统,支持ISO7816以及PCOS的数据格式和命令.MPCOS具有两级目录文件结构,即MF下可以有一级DF,每个DF下最多可创建63个EF. MP ...
- 智能卡安全机制比较系列(四) PayFlex
PayFlex是斯伦贝谢公司(经过若干整合现在是金雅拓的一部分)在上世纪90年代推出的一款电子钱包支付COS,从功能上看可以说PayFlex是EMV96以及PBOC电子钱包规范的雏形. PayFlex ...
- JVM系列文章(四):类载入机制
作为一个程序猿,只知道怎么用是远远不够的. 起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP ...
- Javascript事件模型系列(一)事件及事件的三种模型
一.开篇 在学习javascript之初,就在网上看过不少介绍javascript事件的文章,毕竟是js基础中的基础,文章零零散散有不少,但遗憾的是没有看到比较全面的系列文章.犹记得去年这个时候,参加 ...
- Winsock系列函数 及 Socket通信流程
Socket是一种网络通信机制 Winsock系列函数 1. Socket 创建socket 2. Connect 尝试连接远端Socket 3. Send 在某个Socket 向远端 ...
- jvm系列(七):jvm调优-工具篇
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...
随机推荐
- Linux系统编程(26)——守护进程
Linux系统启动时会启动很多系统服务进程,比如inetd,这些系统服务进程没有控制终端,不能直接和用户交互.其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户 ...
- delphi客户端调服务器端的java webservice如何在参数中传对象? 转
我试过java返回一个对象到delphi端没问题,可反过来,delphi通过参数传一个对象到java,java端得到的对象值变为空,不知道是不是delphi这边设置或者对象注册方面有问题,究竟该怎么解 ...
- android 在EditText中显示表情图片
public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { su ...
- 大型分布式C++框架《二:大包处理过程》
本来这一篇是打算写包头在分布式平台中的具体变换过程的.其实文章已经写好了.但是想了这个应该是不能随便发表的.毕竟如果知道了一个包的具体每个字节的意义.能伪造包来攻击系统.其次来介绍一个包的具体变换过程 ...
- 简单Mysql思维导图
- iOS socket 实现tcp和服务器长链接的简单使用心得
首先iOS端用了一个第三方的框架 GCDAsyncSocket 当然这个是CocoaAsyncSocket框架里面的一部分 Github下载地址https://github.com/robbiehan ...
- 关于url路径的定义方式
一.概述 无论是做网页,还是WEB系统,我们都会用到链接,图片,文件的地方,这些地方都涉及到路径的问题,例如:background-image:url();这一CSS样式,而url()的定义方式有两种 ...
- 使用JMeter做压力测试
使用JMeter做压力测试 1.下载Jmeter 地址:http://jmeter.apache.org/download_jmeter.cgi 2.启动jmeter 运行bin/jmeter.bat ...
- Log4Qt 使用(一)
一.下载 http://sourceforge.net/projects/log4qt/develop 二.Log4Qt介绍 Log4Qt 是Apache Log4J 的Qt移植版,所以看Log4J的 ...
- easyui datagrid 行数
$('#gridList').datagrid('getData').rows.length