PBOC2.0安全系列之—脱机认证之动态数据认证(DDA)
动态数据认证:
一,什么是动态数据认证(DDA)
由于上篇<< PBOC2.0安全系列之—脱机认证之静态数据认证(SDA)>>已经对静态数据认证部分做了详细的分析,一些基本知识本章不重复说明,需要明确指出的是:无论SDA和DDA,两者都是属于脱机认证的范围。
在上一篇中,我们知道静态数据认证(SDA)的目标是解决发卡行静态数据的防篡改,但局限是无法防止复制卡或者伪造卡的情况,而这种复制卡和伪造卡恰恰是金融卡安全面临的最大问题。
举两个现实的例子:
1,笔者本人亲自遇到的:某天突然收到招行信用卡中心的电话,说监控发现我的卡在某个异地有从pos查询余额的记录,需要确认是否我本人的操作,我否认后,招行即可冻结了我的卡,然后要求我本人在某台ATM上做一次查询操作(笔者理解是招行想确认卡真正在我的手上),完成了回拨招行信用卡中心,答复是卡被非法复制的可能性非常大,要求及时换卡,所幸的是没有遭受财产损失。
2,大家经常在电视上或者网上看到的ATM犯罪场景:犯罪分子拿着自己定制的读卡器和摄像头到ATM去,把ATM插卡的卡套去掉换成了自己的读卡器,然后在ATM的某个不引人注意的角落里面安装上自己的针孔摄像头,当用户来取钱的时候,由于用户不小心把卡插入到了犯罪分子的读卡器,读卡器就可以把卡里面的数据都读出来并存储到自己的读卡器,同时,通过针孔摄像头拍摄用户输入的密码,然后他们回去将卡数据复制到新的空白卡,有了卡和密码,接下来的情况大家都可以猜到了…
而动态数据认证(DDA)就是要解决卡被复制后的认证问题,使得终端有能力发现卡是伪造的,基本的核心点是:卡里面有些东西是无法复制的,且无法复制的部分是埋入了卡的唯一认证密钥。
上面这句话可能比较抽象,不过不用担心,接下来笔者会重点阐述具体的原理。
二,动态数据认证(DDA)的实现原理
我们已经知道,动态数据认证的目的主要是用于防止伪造卡片。但具体如何实现呢?
1,基本原理:
再说明DDA的基本原理前,我们先review一下SDA的主要流程,方便我们进行对比:从实现技术角度看,SDA是利用发卡行公钥,CA公钥进行认证,IC卡发卡行发卡的时候写入静态数据,如卡号等,为了证明这些静态数据是发卡行写入的,而不是其他非法的机构写入的,发卡行要用自己的发卡行私钥进行签名,当然主要是对这些数据先进行计算一个摘要,然后对摘要进行签名,得到一个数字签名,并把这数字签名也一起写入卡片。这样,在实际的交易过程中,卡片插到终端后,卡片会发送这些静态数据和数字签名一起给到终端,终端会通过数据中的CA公钥余项找到对应的CA证书,然后用CA证书中的CA公钥认证发卡行的证书,通过认证后,拿到发卡行公钥证书,再用发卡行公钥来解密验证数字签名,然后拿这个结果和卡片发送过来的数据进行对比。
而DDA相比SDA来说,重点在于IC卡公私钥对,IC卡私钥是放在安全存储区域的,而验证过程是在SDA的基础上,在终端验证静态数据以后,终端会发送内部认证命令(内部认证就是终端认证卡片,外部认证就是卡片认证终端)给到卡片(见图的红色画圈部分),命令中包含了由DDOL指定的数据元,IC卡会根据这个列表中指出的数据用IC卡私钥进行加密生成数字签名,这个结果即是签名的动态应用数据,接下来,终端收到这数据后,会像SDA一样,用CA公钥证书->发卡行公钥证书->IC公钥证书,从IC卡公钥证书拿到IC卡公钥来解密IC卡私钥加密的数据,并进行比较结果。
这里笔者也附上来自PBOC规范对DDA部分原理的说明:终端要求卡片提供由IC卡私钥(相比SDA使用的是发卡行私钥签名静态数据,这里使用的是不同的IC卡私钥,这个私钥存储在IC卡的一个安全区域内,无法进行复制)加密动态交易数据生成的密文,动态交易数据是由终端和卡片为当前交易产生的唯一数据。终端用从卡片上获取的IC卡公钥来解密动态签名,如果还原的数据与原始数据匹配证实了此卡不是由合法卡复制出的赝品卡。复合动态数据认证/应用密文生成把动态签名生成与卡片的应用密文生成相结合,确保卡片行为分析时返回的应用密文来自于有效卡。
2,实现步骤:
在分析实现步骤前,我们先重点分析一下各个关键实体需要持有的证书或者密钥对的情况:
实体 |
拥有证书或者密钥对等 |
发卡行 |
发卡行私钥 |
IC卡 |
发卡行证书(经过CA签名的发卡行公钥), IC卡证书(用发卡行私钥进行签名), 卡片私钥, 卡片静态数据和用发卡行私钥对静态数据进行签名的数字签名 |
终端 |
CA公钥 |
从上面可以看到,相比SDA,DDA的证书和密钥持有情况最大的不同是:IC卡多了IC卡证书和卡片私钥。
因此,DDA相比SDA来说,除了具备SDA的防篡改保护外,最强大的地方是防止卡复制,相比SDA,它的签名是动态的,SDA的签名在卡发行的时候就已经定好了,它签名所用的私钥是发卡行私钥,而DDA每次用来签名的数据是当前交易中的一些动态数据,签名所有的密钥是IC卡私钥(不同的IC卡具有不同的IC私钥),这个存储在IC卡里面的一个安全存储区域内(这个非常重要,一般是专门的安全芯片,是无法读出的),而终端这边通过从IC卡读取出对应的IC卡公钥来解密验证。那么如何实现防复制呢?
举个例子:张三的卡被李四复制了一张,当李四拿着复制的卡到ATM进行取钱的时候,终端会要求认证IC卡,于是发一串动态的交易数据给IC卡,IC卡会生成一个用自己IC卡密钥签名的应用密文给到终端确认,而关键的地方就在这里,这个签名需要用到IC卡私钥来签名,而这个IC私钥是存储在IC卡的安全芯片内,李四复制的卡无法拿到,因此无法生成对应的签名数据给到终端确认或者随便用一个私钥进行签名拿到一个串给到终端,而终端这个时候是用IC卡对应的公钥来解密,发现通不过,因为终端解密的IC卡公钥和复制卡的IC私钥不是配对的,因此验证失败,交易中止。
需要重点说明的是:IC卡是CPU卡,智能卡,里面有复杂的文件结构,不像磁条卡结构那么简单,并且最关键的是有一个IC卡私钥存储于IC卡文件安全区域,相当于XP系统的系统文件,有权限都复制不了,即就是把整个卡都复制了,IC卡私钥也没有被复制进去,而DDA就是依赖这个IC卡私钥来确认卡片的真实性,防止卡片的非法复制。
动态数据认证有标准动态数据认证(DDA)和复合动态数据认证(DDA/AC-CDA)两种。
并且DDA是在卡片行为分析前执行,此时,IC卡将来自卡片的动态数据以及由动态数据认证数据对象列表(DDOL)所标识的终端数据用IC卡私钥生成一个数字签名。
标准动态数据认证(DDA)的详细过程如下:
密钥和证书分发阶段:
1,发卡行的密钥管理系统产生发卡行公私钥对SI和PI,以及为每一张IC卡生成一对公私钥对SICC和PICC,并将发卡行公钥PI传输至根CA;
2,根CA用自己的私钥SCA对发卡行公钥进行数字签名,产生发卡行证书,连同根CA公钥信息返回给发卡行密钥管理系统;
3, 发卡行用发卡行私钥SI对每个IC卡公钥PICC进行数字签名,产生IC卡证书;--关键一步
4,发卡行密钥管理系统将发卡行证书及IC卡证书,IC卡私钥传送至发卡系统;
5,发卡系统在个人化时将发卡行证书和IC卡证书写入卡片中,(笔者标识:同时在制卡的时候,把IC私钥一起存入卡的安全存储芯片中)
6,根CA将自己的公钥PCA传送给收单行的终端管理系统;
7,终端管理系统把根CA公钥PCA通过远程下发到终端。
交易验证阶段:
1,终端从卡片读取发卡行证书及IC卡证书,使用根CA公钥PCA恢复出发卡行公钥PI,使用恢复的发卡行公钥PI恢复出IC卡公钥PICC;
即发卡行公钥+IC卡证书+RSA算法=IC卡公钥
2,终端向IC卡发送内部认证命令(INTERNAL AUTHENTICATE)请求一个动态签名,卡片连接内部认证命令中的终端数据和在IC卡中动态数据中指定的卡片数据,由存储于卡片安全芯片的卡片私钥SICC对该数据进行数字签名并返回终端;
3,终端使用IC卡公钥PICC对数字签名进行验证,并将验证结果返回给卡片。
复合动态数据认证(DDA/AC-CDA)的详细过程如下:
这种方式是在第一个请求应用密文命令发出后执行,IC卡将来自卡片的数据包括应用密文以及来自终端的数据生成一个数字签名。具体过程跟DDA基本相同:
1,发卡行的密钥管理系统产生发卡行公私钥对SI和PI,以及为每一张IC卡产生一对公私钥对SICC和PICC,并将发卡行公钥PI传送至根CA;
2,根CA用自己的私钥SCA对发卡行公钥进行数字签名,产生发卡行证书,连同根CA公钥信息返回给发卡行密钥管理系统;
3,发卡行用发卡行私钥SI对IC卡公钥PICC进行数字签名,产生IC卡证书;
4,发卡行密钥管理系统将发卡行证书及IC卡证书传送至发卡系统;(笔者标识:包括IC卡私钥)
5,发卡系统在个人化时将发卡行证书和IC卡证书写入卡片中。(笔者标识:同时在制卡的时候,把IC私钥一起存入卡的安全存储芯片中)
6,根CA将自己的公钥PCA传送至发卡行的终端管理系统;
7,发卡行终端管理系统将根CA公钥PCA通过远程下发到终端;
交易验证阶段:
1,终端从卡片取出发卡行证书及IC卡证书,使用根CA公钥PCA恢复出发卡行公钥PI,使用恢复的发卡行公钥PI恢复出IC卡公钥PICC;
2, 终端像卡片发出应用密文命令(GENERATE AC),卡片响应该命令;(跟DDA不同点)
3,卡片连接终端通过另外的命令送来的数据及自己的响应数据,由卡片私钥SICC对该数据进行数字签名并返回给终端;
4,终端利用卡片公钥验证卡片动态生成的签名,这一步在联机处理过程中执行,如果验证失败,则交易拒绝。
PBOC2.0安全系列之—脱机认证之动态数据认证(DDA)的更多相关文章
- PBOC2.0安全系列之—脱机认证之静态数据认证(SDA)
一,什么是PBOC2.0 2005年3月13日,人民银行发布第55号文,正式颁发了<中国金融集成电路(IC)卡规范>(简称PBOC2.0).该规范补充完善电子钱包/存折应用:增加借/贷记应 ...
- 静态数据认证(SDA)与动态数据认证(DDA)的区别
PBOC/EMV里有两个非常重要的概念,SDA(staticdataauthentication)和DDA(dynamicdataauthentication),分别叫做静态数据认证和动态数据认证.这 ...
- 【EMV L2】CDA复合动态数据认证/应用密文生成
复合动态数据认证/应用密文生成处理流程:对于复合动态数据认证/应用密文生成,终端执行标准动态数据认证的步骤1到3:1.认证中心公钥的获取终端使用认证中心公钥索引(PKI)以及卡片中的注册的应用提供商标 ...
- 【EMV L2】DDA标准动态数据认证处理流程
[标准动态数据认证DDA] 标准动态数据处理过程,除了动态签名由卡片生成以外,其他都是由终端执行的.处理过程: 1.认证中心公钥的获取终端使用认证中心公钥索引(PKI)以及卡片中的注册的应用提供商标识 ...
- 【EMV L2】SDA静态数据认证处理流程
[静态数据认证] 静态数据认证处理过程中,卡片没有执行任何处理,终端执行的处理流程:1.认证中心公钥的获取终端使用卡片上的认证中心公钥索引(PKI)[TAG:8F,Certification Auth ...
- PBOC2.0与3.0的区别
一.PBOC规范颁布的历程 1997年12月,PBOC V1.0 定义了五个方面的事项 电子钱包/电子存折应用(EP,ED) 卡片和终端的接口 卡片本身的技术指标 应用相关的交易流程 终端 ...
- PBOC2.0与PBOC3.0的区别
2013年2月,中国人民银行发布了<中国金融集成电路(IC)卡规范(V3.0)>(以下简称PBOC3.0),PBOC3.0是在中国人民银行2005年颁布的<中国金融集成电路(IC)卡 ...
- 【转】PBOC3.0和PBOC2.0标准规范异同分析
2013年2月,中国人民银行发布了<中国金融集成电路(IC)卡规范(V3.0)>(以下简称PBOC3.0),PBOC3.0是在中国人民银行2005年颁布的<中国金融集成电路(IC)卡 ...
- WCF 4.0 进阶系列 -- 随笔汇总
WCF4.0 进阶系列–前言 WCF4.0 进阶系列--第一章 WCF简介 WCF4.0进阶系列--第二章 寄宿WCF服务 WCF4.0进阶系列--第三章 构建健壮的程序和服务 WCF4.0进阶系列- ...
随机推荐
- Git commit template 模板设定
多人协作开发一个项目时,版本控制工具是少不了的,git是linux 内核开发时引入的一个优秀代码管理工具,利用它能很好使团队协作完成一个项目.为了规范团队的代码提交,也方便出版本时的release n ...
- python交换两个变量的值,一句代码搞定
a = 10 b = 20 # 不需要中间变量,一步搞定 a, b = b, a
- join函数——Gevent源码分析
在使用gevent框架的时候,我们经常会使用join函数,如下: def test1(id): print(id) gevent.sleep(0) print(id, 'is done!') t = ...
- JS 禁止浏览器右键菜单和刷新
<script language="javascript"> //禁止按键F5 document.onkeydown = function(e){ e = window ...
- JSON.parse()和JSON.stringify()的用法
JSON.parse()是用于从一个字符串中解析出json对象,如下所示 var str = '{"name":"flsummer","age&quo ...
- C++标准库和标准模板库
转自原文http://blog.csdn.net/sxhelijian/article/details/7552499 C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标 ...
- gdal vc++ 配置说明
1在VC中,打开菜Tool-Option,在Directories页面中的Library files中和Include files中分别添加GDAL的LIB文件目录和INCLUDE文件目录2打开菜 ...
- 读<<代码整洁之道>>的感想
花去了近一周的时间浏览一下这本书.总体感觉这本书写得不错. 我发现自己以前写的代码时多么的糟糕.有很多改进之处... 同时我也发现写出优秀的代码不易.优秀的代码不仅仅易读,并且易修改,易维护,程序易维 ...
- js解决通过json传来的timestamp类型时间的显示问题
[javascript] view plaincopyprint? function timeStamp2String(time){ var datetime = new Date(); dateti ...
- [Leetcode][Python]45: Jump Game II
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 45: Jump Game IIhttps://oj.leetcode.com ...