密码技术 (4) - 消息认证码

一. 前言

        消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,简称为MAC。消息认证码由三部分组成:任意长度的消息,发送者和接收者之间共享的秘钥,输出的固定长度的数据,称为MAC值。消息认证码的生成也借助单向散列函数,和散列值生成都是一样的,除了生成MAC值需要共享秘钥,区别如下图:

密码技术 (4) - 消息认证码_第1张图片

        注意, 消息认证码和对称密码一样,也需要解决秘钥传送问题,这就需要配合公钥密吗等技术了。

二. 消息认证码的用途

1. SWIFT

        SWIFT的全称是Society for Worldwide Interbank Financial Telecommunication(环球银行金融电信协会)。于1973年成立,成立目的是为了保护国际银行间的交易,银行和银行间通过SWIFT来传递交易消息,为了验证消息的完整性以及对消息进行认证,SWIFT使用了消息认证码。

2. IPsec

        IPsec是对IP协议通信增加安全性的一种方式,在IPsec中,对通信的内容的完整性和认证也是采用消息认证码。

3. SSL/TLS

        SSL/TLS是一种应用于WEB场景的通信协议,SSL/TLS中对通信内容的认证和完整性校验也使用了消息认证码。

三. 消息认证码的实现方式

1. HMAC

        消息认证码可以使用单向散列函数来实现,其中的一种实现方式就是HMAC。其中的H就是hash的意思。

        使用SHA-1,SHA-224,SHA-256,SHA-384和SHA-512所构造的HMAC,分别称为HMAC-SHA1,HMAC-SHA-224,HMAC-SHA-256,HMAC-SHA-384和HMAC-SHA-512。

2. 使用分组密码实现
3. 其他办法

四. openssl实践

1. HMAC

# echo -n 'hello,hmac' | openssl dgst -hmac '123456' -sha256
(stdin)= 0c0731d78b729a5df92874654e7fa7298235c5b9df0cf11943a9488984ac81d4

或者通过文件获取消息,如下

infile内容:

hello,hmac

命令:

openssl dgst -hmac '123456' -sha256 -out hmac.txt infile 

hmac内容:

HMAC-SHA256(infile)= 0c0731d78b729a5df92874654e7fa7298235c5b9df0cf11943a9488984ac81d4

五. 消息认证码不能解决的问题

1. 向第三方证明消息来源        

        消息的接收者无法向第三方(例如法庭)证明消息就是来自消息的合法发送者,因为消息的接收方和发送方都能生成相同的MAC值,甚至消息就是接收者自己伪造的,或是秘钥泄露,其他人发送给接收方的。

2. 防止否认

        由于消息的发送者和接收者是预共享秘钥的,所以,接收者收到发送者的消息后,发送者可以否认消息是自己发送的,发送者可以说消息是接收者自己伪造的,也可以说接收者泄露了密码,消息是其他人发送给接收者的,所以,消息认证码无法解决否认问题

六. 总结

        消息认证码的生成同散列值的生成非常类似,除了消息认证码需要共享的秘钥除外。消息认证码目前的主要的实现方式是通过HMAC的方式。由于消息的发送者和接收者都拥有秘钥,消息认证码不能解决消息的真实来源问题,会出现消息的发行者否认的情况。

你可能感兴趣的:(密码技术,密码技术)