赞
踩
防止数据被掉包。----确保散列值来源于原始数据,而不是被篡改过的数据。
假设现在两家银行,招商银行A和建设银行B,你因为买房或者其他特殊原因,从A银行贷款100万元,但由于A银行业务问题,暂时没有那么多钱,那么A银行就委托B银行,让B银行将钱转到你的账户(假设B银行的账户是6210…………489,你预留给A的收款账户是4223…………612)。A银行给B银行发送消息如下:
贵银行:
因本公司业务问题,暂时需麻烦从贵公司转账100万元到账户6210…………489。谢谢!
A银行
2020-12-24
当然,在B银行收到这封转账信息的时候,会去认真核实信息的准确性。如果在这封信发送的过程中,消息被主动攻击者M截获并进行了篡改(消息的完整性被破坏):
①如果M将收款账户换成自己的账户,那么你贷款的这100万元将变成M的财产;
②如果M将金额变成1000万,那么你明明贷款是100万,但是却受到1000万(当然这不太现实);
以上这些都会给A造成不必要的损失。
还有A银行根本没有发送这样的消息,完全就是M伪装A给B发送了这条消息,或者A明明发送了这个消息,但是当B来找他的时候,A却否认了(认证—B可以确定A确实发过这个信息),说他根本没有发送过这个信息。那这样B就真的有苦说不出,打掉牙往肚子里咽~哈哈
那要如何在保证信息完整性的同时,也能对消息进行认证呢?
答案很明显,用咱们的***消息验证码MAC/HMAC***就可以完成。
MAC是消息认证码(message authentication code)的简称,是一种确认完整性并进行认证的技术。
消息认证码的输入包括任意长度的消息和一个发送者哥接收者之间共享的密钥。它可以输出固定长度的数据,这个数据就称为消息认证码(这一点和单向散列函数很类似,但是注意:***单向散列函数计算的过程中是不需要密钥的,但是计算消息认证码的时候是需要发送者和接收者之间的共享密钥的***)。
认证:要计算MAC必须要持有消息发送者和接收者之间的共享密钥,没有共享密钥的人是根本没办法计算MAC值的,即MAC就是通过这一性质来完整对消息的认证的。
完整性:消息只要发生1比特的变化,MAC值也会产生巨大的变化,这一点和单向散列函数很相似,MAC就是利用这一性质来确认消息的完整性的,。
单向散列函数与MAC的比较
①发送者A银行和接收者B银行事先共享密钥;
②发送者A银行根据上文的汇款请求使用第①步的共享密钥计算出MAC值;
③发送者A银行将汇款请求信息和第②步计算得到的MAC值一起发送给接收者B银行;
④接收者B银行收到消息后,使用第①步的共享密钥对汇款请求信息计算出MAC值;
⑤接收者B银行将自己计算出的MAC与发送者A银行发送过来的MAC进行比较;
⑥如果接收者B自己计算的MAC值与发送者A发送的MAC一致,则接收者B可以确认这个消息确实来自发送者A(即认证成功),最后可以发起汇款;如果不一致,则可以判定消息不是来自发送者A(即认证失败),最后不可以发起汇款。
在MAC计算过程中,发送者A银行和接收者B银行都需要使用到共享密钥,这个共享密钥是不可以被主动攻击者M截取的(一旦共享密钥泄露,使用MAC和不使用MAC是一样的效果)。(***和对称密码一样,都存在密钥的配送问题,这个问题,可以使用非对称密码技术来实现,也可以使用DH密钥交换,还可以使用密钥分配中心……当然具体情况需要具体分析哈~***)
IPsec、SSL/TLS、SWIFT等都应用了MAC技术。
①基于单向散列函数实现消息认证码,简称为HMAC。
②使用对称密码中的分组密码实现。(可以将分组密码的密钥作为消息认证码的共享密钥来使用,并使用CBC模式将全部的消息进行加密,由于消息认证码不需要加密,可以从加密后的密文中最后一个或多个密文分组作为MAC值,然后将其余的密文数据全部丢弃)
③使用流密码或者非对称密码也可以实现消息认证码。
①密钥填充:如果密钥比单向散列函数的分组长度要短,就需要在末尾填充0,直到长度达到单向散列函数的分组长度为止;如果密钥比单向散列函数的分组长度要长,则需要用这个单向散列函数计算出这个密钥的散列值,用这个散列值作为计算HMAC的密钥。
②填充后的密钥和ipad做异或:将填充后的密钥与被称为ipad的比特序列进行异或运算。(其中ipad是将00110110【十六进制的36】不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner内部的意思,异或运算得到的值,就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列,称为ipadkey)
③与消息组合:将第②步产生的ipadkey附加在消息的开头。
④计算散列值:将第③不断结果输入单向散列函数,并计算出散列值。
⑤填充后的密钥与opad进行异或:将填充后的密钥与被称为opad的比特序列进行异或运算。(opad是将01011100即十六进制的5c,不断循环反复直到到达分组长度所形成的比特序列,其中opad中的o就是outer外部的意思,异或运算得到的结果也是一个和单向散列函数分组长度相同且和密钥相关的比特序列,称为opadkey)
HMAC有一个典型的应用就是在挑战/应答(challenge/response)身份认证中。
所谓的挑战应答机制,就是每次进行身份认证时,服务器端都会给客户端发送一个不同的挑战随机值,客户端收到这个挑战随机值之后,做出相应正确的应答。
①客户端向服务器端发送身份认证的请求,请求进行身份认证。
②服务器端接收到请求后从用户库中查询该用户是否是合法的用户,若不是,直接驳回请求,不再进行任何处理。
③若用户是一个合法的用户,服务器端会生成一个随机值,作为发送给客户端的挑战随机值,然后发送给客户。
④客户端收到这个挑战随机值后,将其与用户身份认证信息合并,然后使用哈希函数对合并后的数据进行计算,生成一个应答字符串发送给服务器端。
⑤服务器端收到客户端发送过来的应答字符串,然后与自己计算的结果进行比较,若两者相同,则身份认证成功,否则身份认证失败。
⑥服务器端将最终的认证结果通知到客户端。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。