金融行业密钥体系相关知识及原理介绍

前言

好久没更新博客了,最起码有一两个月了,前段时间一直在忙(其实是借口),在去年年底有幸接触了一些金融支付的一些东西,看了一些POS 应用银联规范文档,非常多,还不容易理解~,索性今天有空,就整理下前段时间接触的知识(POS 终端银联支付密钥体系)。


终端密钥体系

参照中国银联的密钥安全标准,各密钥长度至少 128bit。上层密钥提供对下层密钥的保护或维护。所有的密钥或数据保护都采用3DES。 TMK 为终端主密钥,用来加密、解密需要传输的工作密钥 TAK 或TPK,实现工作密钥联机传送。要求每台 POS 终端的 TMK 不同,该 TMK通过 MK 加密后保持在数据库中。
TAK、TPK 为工作密钥,是最底层的数据加密密钥,也是更新最频繁的密钥,包括 TAK 和 TPK,TAK 为终端信息完整性密钥,TPK 为 PIN保护密钥,这两个密钥的更新都是通过联机交易即签到来完成,使用
TMK 加密后进行传送。 在增加终端资料时,系统将通过加密机为每个终端随机产生不同的 TMK,并获取 TMK 密文(通过 MK 加密)写入联机系统数据库的终端表中,同时该 TMK 需要传送给 POS 终端应用才能正常工作。

一、密钥基础知识

我们知道金融行业有很多数据要在网络上传递,包括从前置到主机,从自助终端到前置等,这些数据在网络上传来传去,我们很容易就会想到安全性的问题,如果这些数据被人窃取或拦截下来,那我们怎么敢在银行存钱了。这个问题在计算机出现时就被前人考虑到了,所以出现了很多各种各样的加解密技术。抛开这些不管,假设当初由我们自己来设计怎样解决数据被窃取的情况。假设我们有一段数据,是ATM取款的报文,包括一个人的磁卡号、密码、取款金额,现在需要将这些数据从一台ATM机器传到前置机处理,这些数据是比较机密的,如果被人窃取了,就可以用该卡号和密码把账户中的钱取走。

首先,我们可以想到用专用的银行内部网络,外面的人无法获得网络的访问权。这个仔细想想显然不可行的,因为一是不能保证外人一定没办法进入银行内部网络,二是银行内部人员作案是没法防止的。
接着,我们很容易想到,既然保证数据不被窃取的可能性很小,那我们何不变换一下思路,数据避免不了被窃取,那我如果将数据处理下,让你即使窃取到数据,也是一些无用的乱码。这个想法比较接近现在的做法了,当前置机接收到了数据,它肯定是对数据进行反处理,即与ATM端完全步骤相反的数据处理,即可得到明文的数据。我们再进一步想想,如果因为某种原因,报文中的取款金额被改变了,这样就会导致ATM出的钱和前置扣账记录的钱不一致的情况,看来我们必须加上一个验证机制,当前置机收到ATM发送的一个报文时,能够确认报文中的数据在网络传输过程中没有被更改过。
怎样实现?最简单的,对通讯数据每一位进行异或,得到0或1,把0或1放在在通讯数据后面,算是加上一个奇偶校验位,收到数据同样对数据每位进行异或,得到0或1,再判断下收到数据最后一位与算出来的是否一致。这种方式太简单了,对于上面提到的ATM到前置机的报文来说,没什么用处,不过我们可以将对数据每一位异或的算法改成一个比较复杂点的。因为DES算法已经出来了很多年了,并且在金融行业也有广泛的应用,我们使用DES算法进行处理,来解决上面的问题。

DES算法(此处指单DES)的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。DES算法是这样工作的:如Mode为加密,则用Key去把数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据在公共通信网中传输的安全性和可靠性。通过定期在通信网络的源端和目的端同时改用新的Key,能更进一步提高数据的保密性。

这里写图片描述

我们用一个Key对前面提到的报文进行DES算法,得到加密后的64位数据,放到报文的最后,跟报文一起送到前置机,前置机收到报文后,同样用Key对数据(不包括最后的64位加密数据)进行DES加密,得出64位的数据,用该数据与ATM发送过来的报文最后的64位数据比较,如果两个数据相同,说明报文没有中途被更改过。

再进一步,因为DES只能够对64位的数据进行加密,一个报文可不止64位,哪我们怎么处理呢?只对报文开头的64位加密?这个是显然不够的。
我们可以这样,先对报文的开始64位加密,接着对报文第二个64位加密,依次类推,不过这有问题,因为每个64位都会得到同样长度的加密后的数据,我不能把这些数据都放到报文的后面(报文的长度就变成两倍长了)。换个思路,我先对报文第一个64位加密,得到64位的加密后数据data1,接着再拿加密后的data1与报文第二个64位数据进行按位异或,得到同样长64位的数据data2,我再用Key对data2加密,得到加密后的数据data3,再拿data3与报文第三个64位数据进行按位异或,同样的处理依次类推。直到最后会得到一个64位的数据,将这个数据放到报文的最后发到前置机,这样报文的长度只增加了64位而已。这个算法就叫做MAC算法。

好了,到目前为止我们已经知道了什么是MAC算法,为什么需要它,接着我们再看看经常被提起的另外一个名词。在上面说到MAC算法的时候,我们会注意到其中进行DES加密算法时提到了一个Key,这个用来参与MAC计算的Key就常被称为MacKey(MAK)。

我们继续来处理ATM和前置机间网络数据传输的问题。前面提到的MAC算法对传送的报文进行了处理,保证了在网络传输过程中数据不会被有意或无意的篡改,但是,我们再进一步想想,如果仍然是上面提到的一个取款报文,如果想作案的话,我不改报文的内容,而只是截取报文的内容,因为内容里面有卡号和密码,都是明文的形式,很容易就看出来哪些内容是卡号、哪些内容是密码。有了卡号和密码,找个读卡器就能够很快的制出一张磁卡,然后拿这个磁卡可以随便取钱了,根本不需要修改报文,这样你就算前置机对报文的MAC校验通过了,也只是保证了报文没被改动过,对于防止作案没有实质上的帮助。
那我们很容易想到,再加上一道加密,这次我把整个取款的报文都用DES加密,将明文全部转换成密文,然后送到前置机,这下好了吧。即使你把报文截取了也没用,你拿着这些密文也没有用,你也没有DES的密钥来解密它,只有前置机才知道密钥。这是个好主意,确实防止了卡号和密码等被人获知的危险。这也是现在普遍采取的做法,不过我们需要对这个做法进行一些改进。

首先,我们要知道用DES对数据加解密是耗时间的,速度是比较慢的。我们来想想,整个取款报文有必要每个数据都DES加密吗?比如报文中的什么流水号、ATM号等信息,对它们加密没什么意义,进一步讲,取款金额加密也没意义,假设你取500块,但是你将报文改成了100块,导致主机只把你账户扣100块钱,你白赚了400块。这个听起来挺划算的,实际上是不可行的,因为这样造成了账务上的短款,银行当然会查账的,根据ATM记录的硬件出钞张数和主机扣款金额,肯定会把你查出来的,那这种掩耳盗铃的做法,下场显而易见。

我们来考虑一个报文中到底什么信息是需要加密的,目前一般的做法是只对账号和密码进行加密(也有只对密码加密的),其他的内容不加密的。对账号和密码加密有个术语,叫PinBlock,即PIN块,就是对账号和密码进行DES加密处理后的一个密文数据块。既然使用了DES算法来加密账号和密码,则必然有个Key来加密,那么我们就把这个Key称为PinKey(PIK),就是专门来加密用户账户和密码的Key。
至于怎样进行加密形成最后的密文PinBlock,有很多标准的,比如IBM3624、ANSI、ISO、DIEBOLD等标准,其实它们大同小异,就是在对报文中的密码进行一个预处理,再用PinKey来DES加密,主要的差别就是怎样预处理而已,比如有的是密码后面补F,补够16 位,就是类似这样的预处理。

到这里我们应该理解PinKey和PinBlock了。通过PinKey和MacKey对报文进行了两重处理,基本上报文就是安全的了。

采用PIK和MAK安全处理后的信息

如果我们对DES算法比较了解,就会知道,如果想对加密后的密文解密,必须要知道Key才行,所以说Key一定要保密。怎样来保密Key呢?我们前面提到的无论是算MAC还是算PIN块,都是直接拿明文的Key来计算的,那么这个Key很容易被窃取的,比如有人在机器上装了个黑客程序,只要检测到你在用Key加密数据,就把明文的Key获取了。

这样看来,我们还要对PinKey和MacKey本身进行加密,不要让人知道了。怎样实现,同样是DES算法大显身手的地方。我再找个Key对PinKey和MacKey进行一次加密,这样你就看不到PinKey和MacKey的明文了,好,解决问题了。这时用来对PinKey和MacKey进行加密的Key就被我们称为MasterKey,即主密钥,用来加密其他密钥的密钥。不过,那MasterKey怎么办,它是明文啊。再找个Key来加密MasterKey,那最终无论处理多少道,最后的那个Key肯定是明文,这样看来,安全的问题还没有解决。

既然此路不通,那我们需要换个思维角度,仔细想想怎样处理明文的MasterKey。黑客程序只能窃取软件上的东西,如果我把MasterKey放到硬件加密机里面,黑客是没能力跑到硬件加密机里面把MasterKey取出来的。这样只需要把加密级别最高的MasterKey放到硬件加密机里面,问题就解决了。这时存储在硬件加密机中受硬件设备保护的MasterKey(MK)就称为主密钥(根密钥),加解密PinKey和MacKey同时又受主密钥加密保护的密钥称为次主密钥(Member Master Key,MMK)。

还有个名词经常被提到,就是3DES。为什么要提出3DES的概念呢?其实推出3DES是因为原来的单DES算法随着计算机硬件的速度提升,已经出现被破解的可能性(DES算法中只用到64位密钥中的其中56位,而第8、16、24、……64位8个位并未参与DES运算,而56位长的密钥通过组合变化,其穷举空间最大为256,这意味着如果一台超高速计算机的速度是每一秒钟检测一亿个密钥,则它穷举完全部密钥只需要23年的时间,随着运算速度的不断提升,穷举用时会更短),所以将算法基于DES进行了改进,即对一块数据用三个不同的密钥进行三次加密,使强度更高。但是对于我们理解金融行业的密钥及加密机制来说,用什么算法都一样,不同算法的差别只是在于对数据进行移位变换等处理的方法不同而已。

二、密钥体系结构

不同的信息需要使用不同的密钥加密,密钥分层的好处是有利于密钥的更新和传送,同时保证了密钥的安全性。当其中一级密钥的安全出现问题时,并不会影响其他信息的安全性。
下图以江南科友SJL06加密机为例,介绍硬件加密机的三层密钥结构:

这里写图片描述

第一层,加密机主密钥(Master Key - MK),是保存在硬件加密机内的由三个成分合成的一对最上层密钥,其作用是将所有存放在本地的其它密钥和加密数据进行加密,在硬件加密机以外的地方不会以明文形式存放,是三级密钥体系中最高级别的密钥。
硬件加密机投入运行时,必须先产生和装载MK。由于DES算法依靠某一个密钥进行加密,同时所有密钥和数据都经由MK进行加密,所以MK必须通过一种安全的方法生成和维护。
MK由三个成分(32位十六进制数)组成,需要银行三位主要的密钥管理人员参与产生,一般采用“背对背”形式依次录入,记录checkvalue,分开安全保存明文分量。MK以密文形式存储在加密机黑匣子中,且永远不以明文形式出现。一旦硬件加密机受到非授权的操作,主密钥会自动销毁。

第二层,次主密钥(BMK、ZMK),又被称为密钥加密密钥或密钥交换密钥(Key-encrypting Key或Key Exchange Key)。它的作用是加密在通讯线路上需要传递的工作密钥,从而实现工作密钥的自动分配。它可以在共享网络中两个(或多个)通讯网点之间进行人工分配且保持双方的对称性。
次主密钥由两个成分(32位十六进制数)组成,其产生是由两位密钥管理员用“背对背”的方式共同完成。对于SJL06 RACAL型加密机(雷卡),次主密钥为ZMK(Zone Master Key),需要密钥管理员记录ZMK密钥密文和checkvalue,并将ZMK密文(从第一位“X”后的所有32位16进制数)录入加密机外部的主机数据库中保存;对于SJL06 JK&IC型加密机(金卡),次主密钥为BMK(Bank Master Key),是以索引方式通过MK加密直接保存在硬件加密机中。

第三层,通常称为工作密钥或数据加密密钥,包括信息完整性密钥(MAK)、PIN保护密钥(PIK)、终端密钥(TMK),它的作用是加密各种不同的数据,从而实现数据的保密,信息的认证,以及数字签名的功能。这些数据密钥在本地存放时,处于次主密钥的加密之下或直接保存在硬件加密机中。
工作密钥需要经常性地定期更换,通常每天更换一次或在系统启动时更换新密钥。

三、硬件加密与软件加密的比较

软件加密是不依靠硬件使用程序软件来实现的对数据的加密技术,而硬件加密是依靠硬件设备对传输的数据进行加密的技术。两者的相同点为:使用的加密算法相同,并且密钥体系也相同。

两者的不同点为:
软件加密时很多重要的信息(如用来做密码运算的密钥,或客户的PIN)都会在某时间清晰的出现于计算机的内存或磁盘上,而对计算机数据安全有一定研究的不法分子便有机会把这些资料读取、修改或删除,破坏系统的安全性。

硬件加密所有密码运算都在加密机内完成,在完整的加解密过程中,仅在硬件加密设备内部出现密钥和PIN的明文,有效防止了密钥和PIN的泄露,并且在受到非法攻击时,加密机内部保护的密钥会自动销毁。
鉴于软件加密不能提供一种有效的机制保护密钥和客户密码PIN的存储安全,国际银行卡组织(VISA、万事达)以及我国的银联组织均作出了在金融系统中必须使用硬件加密设备的规定。

  • 12
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值