Javacard技术总结之--- 消息摘要算法
概述:
在智能卡与外界的通信中,消息摘要主要用来保证信息交换过程数据的完整性(integrity)、真实性(authenticity)、私密性(Confidentiality)。消息摘要是对原始数据按照一定算法进行计算得到的结果,它主要检测原始数据是否被修改过。通常用公钥密码算法进行数字签名时,一般不是对消息直接签名,而是对消息进行hash等运算获得一个固定长度的消息摘要,再对这个消息摘要进行签名,这样既可以减少计算量、提高效率,也可以破坏数字签名算法的某些代数结构。
消息摘要和加密的区别:
消息摘要与加密不同,加密是对原始数据进行变换,可以从变换后的数据中获得原始数据,而消息摘要是从原始数据中获得一部分信息,它比原始数据少得多,因此消息摘要可以看作是原始数据的指纹。
消息摘要算法的种类:
消息摘要算法包含 MD,SHA,MAC三大系列。经常用来验证数据的完整性,也是是数字签名的核心算法。这三大体系的典型算法如下:
l MD算法包括:MD2,MD4,MD5 三种算法
l SHA算法包括 SHA-1,SHA-2系列算法:SHA-224,SHA-256,SHA-384,SHA-512
l MAC算法主要包括: HmacMD5,HmacSHA1 、HmacSHA256,HmacSHA384, HmacSHA512算法
l 消息摘要算法衍生算法:RipeMD系列、RipeMD128....Tiger,GOST3411以及Whirlpool算法
消息摘要(MD)原理:
例如当甲和乙通信时,如下图所示,甲有一段秘密的文字如:"My Secret Words",消息摘要(假如使用MD5)经算法变换后得固定长度128bit到MD5码(b9944e9367d2e40dd1f0c4040d4daaf7),将数据和消息摘要一起发送给乙方。乙方收到数据时使用事先约定好的消息摘要算法对数据进行处理,如果乙方生成的MD5不是(b9944e9367d2e40dd1f0c4040d4daaf7),则说明数据在传输的过程中遭到破坏。假如"My SecretWords "(多了一空格),MD5(12c774468f981a9487c30773d8093561)差别非常大,而且之间没有任何关系。
MAC:
上述的通讯过程会产生问题,即若传递过程中别人修改了数据时,同时也修改了消息摘要。乙方就无法确认数据是否正确。消息验证码(MAC)可以解决这一问题。 使用消息验证码的前提是 甲方和乙方双方有一个共同的密钥,这样甲方可以将数据计算出来的消息摘要加密后发给乙,以防止消息摘要被改。由于使用了共同的密钥,所以称为“验证码”。MAC机制的传输过程如下图所示:
使用消息验证码的前提是 甲和乙双方有一个共同的密钥,这样甲可以将数据计算出来的消息摘要加密后发给乙,以防止消息摘要被改。由于使用了共同的密钥,所以称为“验证码”。
数字签名:
使用以上两种技术可以保证数据没有经过改变,但接收者还无法确定数据是否确实是某个人发来的。尽管消息码可以确定数据是某个有同样密钥的人发来的,但这要求双方具有共享的密钥,若有一组用户共享,我们就无法确定数据的来源了。
数字签名可以解决这一问题。数字签名利用非对称加密技术,发送者使用私钥加密数据产生的消息摘要(签名),接收者使用发送者的公钥解密消息摘要以验证签名是否是某个人的。由于私钥只有加密者才有,因此假如接收者用某个公钥解密了某个消息摘要,就可以确定这段消息摘要必然是对应的私钥持有者发来的。
使用数字签名的前提是接收数据者能够确信验证签名时(用发送者的私钥加密消息摘要)所用的公钥确实是某个人的 (因为有可能有人假告公钥)。数字证书可以解决这个问题。
数字证书:
数字证书含有两部分数据:一部分是对应主体(单位或个人)的信息,另一部分是这个主体所对应的公钥。即数字证书保存了主体和它的公钥的一一对应关系。同样,数字证书也有可能被假造,如何判定数字证书的内容的真实性呢?所以,有效的数字证书必须经过权威 CA的签名,即权威CA验证数字证书的内容的真实性,然后再在数字证书上使用自己的私钥签名(相当于在证书加章确认)。
这样,当用户收到这样的数字证书后,会用相应的权威 CA的公钥验证该证书的签名(因为权威的CA的公钥在操作系统中己经安装)。根据非对称加密的原理,假如该证书不是权威CA签名的,将不能通过验证,即该证书是不可靠的。
若通过验证,即可证实此证书含的信息(发信人的公钥和信息)是无误的。于是可以信任该证书,便可以通过该证书内含的公钥来确认数据确实是发送者发来的。于是,双方通信时, 甲把数据的消息摘要用自己的私钥加密(即签名),然后把自己的数字证书和数据及签名后的消息摘要一起发送给乙,乙处查看甲的数字证书,假如甲的数字证书是经过权威CA验证可靠的,便信任甲,便可使用甲的数字证书中附带的甲的公钥解密消息摘要(这一过程同时确认了发送数据的人又可以解密消息摘要),然后通过解密后的消息摘要验证数据是否正确无误没被修改。
Hash
一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash
算法的认证协议,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。可看做是消息摘要和Hash的一个结合。常用的算法有:
l HmacMD5
l HmacSHA1
l HmacSHA256
l HmacSHA384
l HmacSHA512
HMAC需要一个加密用散列函数(表示为H)和一个密钥K。我们假设H是一个将数据块用一个基本的迭代压缩函数来加密的散列函数。我们用B来表示数据块的字长。(以上说提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字长(MD5中L=16,SHA—1中L=20)。鉴别密钥的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。一般情况下,推荐的最小密钥K长度是L个字长。(与H的输出数据长度相等)。
GP规范中的应用:
图一:生成消息摘要,未使用加密
图二:在图一描述生成消息摘要基础上,使用密码,生成消息摘要的签名
图三:在APDU指令中,将要发送的数据先进行MAC,将生成的消息认证数据附加到发送的命令后面。