• 20199301 2019-2020-2 《网络攻防实践》 综合实践


    20199301 2019-2020-2 《网络攻防实践》 综合实践

    论文信息

    Improved Group Off-the-Record Messaging
    (基于OTR协议的安全传输方法)

    • Hong Liu
      Department of Computing and
      Information Sciences
      Kansas State University
      hongl@ksu.edu
    • Eugene Y. Vasserman
      Department of Computing and
      Information Sciences
      Kansas State University
      eyv@ksu.edu
    • Nicholas Hopper
      Department of Computer
      Science and Engineering
      University of Minnesota
      hopper@cs.umn.edu

    摘要

    OTR协议是一种为了进行实体之间的认证、在实体之间安全地分配密钥,实现发送和接收消息的完美前向加密性和不可追溯性的安全协议。在对OTR协议的研究基础上,针对OTR协议密钥交换过程存在的安全隐患,采用首先建立安全通道并在安全通道中进行会话密钥的首次交换的方法进行了改进。安全通道采用AES算法对需要发送的公钥和数字签名进行加密操作的方式建立,从而能够实现对通信双方的身份保护以及防止第三方窃听。最后通过编程实现了改进方法,验证了该方法的可行性。

    OTR协议简述

    OTR协议是在2004年,由Borisov、Goldberg以及Brewer等人研究出来的安全协议,该安全协议首次使用是作为一个小插件,它被用于Liunx系统的GAIM中,现在OTR协议以各种各样的形式得到了实现,它不仅仅被用在了各种即时通信软件中作为第三方插件使用,也获得了MacOS系统的青睐。并且,目前仍然有很多学者在为OTR协议获得更大的扩展性而工作。
    OTR协议最初的版本是在论文Off-the-record communication, or, why not to use PGP中提到的,它最初的设计是为了实现在网络上进行现实中才存在的完全私密通话,即实现一个私人对话,在这个私人对话里只有通信双方,因此在这个对话里,只有通信双方知道对话内容,其他人都无法获得他们两方的对话内容,当这次私人对话结束后,这次对话产生的内容与数据,一律被焚毁,确保其他任何人都无法得到这些对于通信双方而言极具隐私性的内容。同时在这篇论文中,作者提到了即使这次通信的两方可以相互之间获得对方的身份信息,可以确定对方就是自己想要通信交流的对象,但是通信双方也只能相互之间确认和自己交流的人的身份,通信两方都无法拿出可信的证据来证明和自己交流对话的人是谁。
    OTR协议选择使用DH密钥交换协议来提供需要的前向保密性,在身份认证方面,在最初版本的论文中,OTR协议选择去使用RSA算法进行计算得到公私钥,然后用这样获得的公私钥进行签名操作,通过数字签名的方式来验证消息发送者的身份。但是众所周知,数字签名的存在是为了给消息提供不可否认的性质,但是数字签名的特性又让所有人都可以对消息进行验签工作来进行身份认证工作,因此OTR协议的作者选择只在DH密钥交换协议中的密钥交换的步骤中进行数字签名的操作,对于正常通信的消息对话内容不进行签名的操作,这样可以确保只有DH协议的密钥交换发送的密钥是可以认证身份的,而发送过来的消息就无法确认是对方发送来的,通过这种方式来确保OTR协议的消息可以被否任的特性,同时为了确保通信双方所发送的消息数据是完整的,OTR协议选择使用MAC来验证消息的来源。

    OTR协议现状

    Off-the-Record协议[1]是由Borisov、Goldberg以及Brewer等人在2004年提出的一款安全协议,该协议具有前向安全性和不可追溯性的优点,能够为即时通讯提供一种可靠的加密保护措施,现在也被应用在了其他场景中。OTR协议的首次出现是作为Linux系统中的GAIM的一个小插件来给用户提供服务的,目前来看OTR协议可以作为很多即时通信软件比如Trillian的第三方插件来使用,同时,MacOS系统也内置了OTR协议,并且很多有关的学者如Goldberg仍然在不断的为改进OTR协议而工作,这更加提高了OTR协议的适用性。
    现在使用的OTR协议采用的是128比特长度的密钥交换协议以及1536比特的Diffie-Hellman密钥交换协议来进行通信双方的密钥交换活动,数据加密则采用的AES高级数据加密标准来进行加密。OTR协议在数据签名时则选择采用长期密钥,且数字签名也仅仅是在最初的密钥交换过程中用来进行通信双方的身份验证。在这之后的消息验证过程中,OTR协议选择了使用HMAC消息认证算法来进行工作。OTR协议具有不可追溯性和前向加密性,OTR协议的会话密钥为短期密钥,OTR协议对每次数据传递所使用的会话密钥进行变更,每次会话都是使用的一个新的会话密钥来进行加解密操作,如此一来,整个会话过程就不会完全依靠于当前会话密钥。即使目前正在使用的会话密钥发生了泄露事故,也不会因此使得其他人获得之前传递的消息的内容,实现了之前传递的消息的安全性,并且这样也降低了长期密钥保存过程中的各种安全风险,为用户提供了一项可靠的安全方案。OTR协议中提到的隐匿身份认证就是通信双方首先要建立一个安全信道,双方身份凭证的交换在这个建立的安全信道内来进行,这样做可以有效地防止双方身份凭证被第三方攻击者所截获。OTR协议中的可否认特性则是指的是,通信双方用户在使用OTR协议时,所发送的所有数据都会伴随一个特定的消息认证码来确认发送方的身份,并且MAC密钥也会随着会话密钥的变化而变化。同时OTR协议会通过特定的密钥选取机制,让接收方在接收数据的时候能进行发送者身份的验证活动,但在在这次传递过程完成之后,哪怕通信中的一方把密钥泄露出去或者是恶意公开密钥,那么他也不能证明在这之前接收的其他数据是从什么地方获得的。与OTR协议不同,用于Email加密的PGP协议使用的是典型的长期密钥以及数字签名的方式来进行双方的消息验证,因此无法实现OTR协议所能实现的完美前向加密性和不可追溯性[2]。
    OTR协议在早期的时候,它仅仅用于两个用户之间进行通信的安全协议,但是在2009年10 月的时候,相关研究学者包括Berkant Ustaoglu和I.Goldberg等人,他们对OTR协议进行了各种扩展活动,进而提出了mpOTR方案,这让OTR协议不仅可以在两方之间进行通信,甚至可以在多方用户之间进行私密性的通信活动,然而不足的是,mpOTR[3]方案它所实现的不可追溯性比传统的OTR协议要弱,因为在一个基于mpOTR协议传输过程中,所有的传输内容会形成一个已知的消息链,这使得所有参与该消息链的用户所发送的通讯消息都会记录在这个消息链上,只要有一个在消息链中的用户向外展示了他的任何私密聊天内容,他都不能否认他发的所有信息,这种逻辑关系使得mpOTR协议没有把OTR协议原来的优点继承下来,因此相关学者选择继续进行研究,而在2013年10月的时候,学者Y.Vasserman和Nicholas Hopper俩人就mpOTR的弱点提出另一项可以用于多方通信的群组OTR方案GOTR(group off-the-record)协议[4],但目前相关内容较少,仍然处于研究阶段,暂时无法获得相关完整性的论文叙述。

    OTR协议安全性分析

    目前OTR协议的主要应用技术运用了AES数据加密算法来对数据进行加密操作,同时使用HMAC来进行消息认证,OTR协议选择了使用DH密钥交换协议来建立共享密钥组,同时只有在第一次密钥交换的过程中才会使用数字签名的方式,加密的时候会采用短期密钥来确保协议可以实现完美前向加密性[10]。
    严格来讲,在OTR协议中,协议选择进行数据加密操作的是使用AES-128的加密模式,而加密密钥却是通过使用DH密钥交换协议,首先进行一遍DH密钥交换协议,将DH密钥交换协议中生成的密钥来作为通信双方的共享密钥,然后OTR协议选择继续对这个共享密钥进行加密操作,这次加密选择的是SHA-256算法。从这部分来看,AES算法目前是无法被攻破的,除非攻击者选择最原始最低级的蛮力穷举攻击,因此,OTR协议选择使用AES算法可以有效地防御攻击,AES算法使用的S盒的模式产生了巨大的混淆作用,如果想要攻破AES-128算法,需要使用野蛮攻击穷举2128个密钥,在这之中找到能够用来破解的密钥是一件十分困难的事情,所以AES-128算法有着足够的安全性,同时,OTR协议选择使用短期密钥,因此即使使用穷举法破解了一个密钥也只能获得这次传输的数据,无法获得在这之前和之后的其他数据,对于攻击者来说,这是一项事倍功半的选择。
    在生成AES加密密钥的过程中,由于DH密钥交换协议所采用的算法只使用了两次模指数运算,这种相对简单的计算方法非常适合OTR协议对于频繁更换密钥的需求,因此发送方和接收方首先就是要进行DH密钥交换协议,通过DH协议来交换双方的密钥,这样双方都得到共享密钥之后,再考虑进行哈希算法的事情。同时发送方和接收方需要高频率的更换加密密钥,确保加密密钥必须是短期使用的,最佳方案就是每次双方进行数据交换之后,都要抛弃旧的密钥,重新进行密钥的协商步骤,通过DH密钥交换协议,通信双方需要生成一个新的共享密钥,然后针对接下来的数据加密,通信双方就需要使用这个新的共享密钥来进行加密,这就要求双方发送的每条信息的内容都要携带下一次用来生成消息加密密钥的DH协议公钥。由技术基础方面的2.2章节可以分析得出,DH密钥交换协议的算法的原理就是离散对数难题的难以破解性,但是根据中间人攻击[11]的方法,攻击者仍然是存在攻破DH算法的可能性的,相关文献认为中间人攻击可能会导致身份错误绑定问题。比如,首先A发送A的公钥给B,但是攻击者C截获了A的公钥,然后C把C的公钥发给了B,B就会使用B的公钥和C的公钥来生成自己的共享密钥K1,然后B会将B的公钥发给A,但是C仍然可以截获B的公钥,然后C会把C的公钥冒充是B的公钥发给A,这样A就会使用C的公钥和A的公钥来生成共享密钥K2,上述过程的结果是,A和B在相互之间通信的时候会认为自己的确是和对方在进行通信,但是实际上是这样,A本想发给B的数据,就发给了C,C虽然没有A和B的私钥,C也没有办法可以得到会话密钥,但这样的攻击方式会很容易造成通信双方的身份误判。因此在原本的DH密钥交换协议的基础上,OTR协议选择去增加一个身份认证的功能,并且通过相关学者和OTR协议创始人之后的努力工作,他们在OTR随后的版本中,就密钥认证交换这部分的内容进行了改进,基本思想是双方在进行Diffie-Hellman 密钥交换之前,通信双方首先要建立一个双方都可以信任的加密信道,然后将身份认证这部分内容在这个双方都可以信任的安全信道内进行。这样可以防止攻击者对通信双方明文传递的身份信息进行截获,然后攻击者对这些私人数据进行恶意利用。同时,使用认证交换的方式可以有效增强OTR协议的安全性,并且使用数字签名也不会对OTR协议的不可追溯性产生影响,可以看到相关信息的其他人只会知道A和B的公钥,并且A和B生成了这两个公钥的事实,他们获得其他关于A和B的更多信息,因此也就无法判断其他更多别的信息。OTR协议在生成共享密钥后,通信双方A和B就会在共享密钥的基础上进行AES-128的加密算法计算和160比特的MAC密钥,具体步骤为,首先对共享密钥采用SHA-1算法运算,把这个结果的前128比特位的值作为AES加密密钥,然后继续使用SHA-1算法或者其他算法进行加密,如此对于加密密钥的二次加密得到的结果就是我们需要的MAC密钥。
    OTR协议为了实现完美的前向加密性选择使用短期密钥,需要使用密钥的时候就去生成密钥,不需要使用密钥的时候就抛弃掉这个密钥,在下一次使用前再重新生成一个新的密钥,其他人甚至包括A和B也无法凭这回溯旧的密钥。为了实现保密性,OTR协议采用了128比特位的AES算法,通过文献[12]中的研究,我们可以得到如此结论,即可以有效阻挡差分攻击和线性攻击的办法只需要四轮的AES算法就可以,文献[13]中则指出只要AES算法大于七轮,那么就可以有效减少受到的渗透攻击,另外根据大量的实验数据可以得到,AES算法可以非常有效的抵御统计攻击和差值攻击。OTR协议选择的是HMAC-SHA1消息认证,这样做可以有效的防止数据在传输的过程被其他人截取,同时这个算法是基于加密的哈希函数SHA1,文献14提到了它有很大的抗攻击能力和雪崩效应[14],同时该算法生成的摘要哈希值长度是160比特位的长度,这样就能有效地应对穷举攻击。

    相关技术基础

    AES高级数据加密标准

    AES[5](Advanced Encryption Standard,AES)高级加密标准,这是一种在我们学习生活中极为常见的一款加密算法,它也被称为Rijndael加密法,AES算法是美国联邦政府采用的,主要用于区块加密的一种加密标准,同时这种加密标准与它的加密算法在很多论文中都被引申研究,并且目前我们经常使用的微信小程序,在这些小程序里,如果涉及到了数据的加密传输,那么大部分用的就是AES加密算法。从AES加密算法的本质来看,AES其实就是一种对称分组密码体制,它所采用的方法就是代换或者置换网络,AES的解密过程其实就是加密过程的逆运算,并且AES算法的出现主要是用于替代已经不再安全的DES算法。
    AES算法在进行加解密操作的时候,AES加密算法会将需要加密的内容按照128位进行选择,然后将128位作为该加密内容的一个分组长度,这样做就可以让AES使用的密钥的密钥长度被严格的分成是128比特、192比特、256比特等不同的长度,值得一提的是,AES算法这样划分出的不同的分组长度都会有着自己这个长度对应的迭代轮数,分别是十轮、十二轮、十四轮。
    关于AES加密轮函数,它现在包含四个步骤,自前向后分别是字节替换、行位移、列混淆、轮密钥加这四个步骤,AES加密首先进行的是字节替换的步骤,在这个步骤中,AES算法选择使用一个非线性的替换函数(如S盒、计算),通过使用这个替换函数将每个我们输入的字节逐步替换成其他的需要被输出出来的字节,而最常被使用的就是S盒的方法,其实S盒就是一个字节矩阵,一般是16乘16的标准。而第二步,行位移步骤,这一步就是简单的把矩阵中的每行进行循环移位,除了要确保第一行不能产生任何变动外,往往向左方进行循环移动,一般是其他三行的矩阵内容分别进行循环移动1、2、3个字节的操作。在这之后,第三步将采取列混淆变换操作,为了让矩阵上的各个值得到充分的混淆,这一步选择了采用算术方法对算法中的矢量矩阵进行替换,列混淆变换的正向列混淆变换对每列独立地进行操作。每列中的每个字节被映射为一个新值,此值由该列中的4个字节通过函数变换得到。第四步采用轮密钥加变换操作,轮密钥操作就是把输入中间状态的没一个字节元素,当前处理轮的子密钥,子密钥是四个字并按照列排列组成的一个16乘以16的矩阵,这个矩阵是由初始密钥生成的,轮密钥操作就是将前两者进行异或处理。经过如上四步骤可以实现AES密钥加密算法。

    DH密钥交换协议

    DH(Diffie-Hellman)密钥交换协议,这是一种用于密钥协商的协议,该协议是由W.Diffie和M.E.Hellman两人开发的,DH协议允许通信双方在不安全的环境下,进行密钥的协商而不使用任何的优先密码。即DH协议可以让双方在完全缺乏通信对方的信息的情况下,通信双方被允许可以通过使用一个不安全的信道交换密钥,进而生成一个通信双方共享的密钥。在这种情况下生成的这个密钥会被用于对后续信息交换进行对称加密。
    DH密钥交换协议的算法逻辑是针对离散对数难题而设计的,即目前我方已知数x、素数p和正整数g,那么计算X使得X等于gx modp,这种计算方式就会比较简单的计算出来。但是按照相反的过程即先知道 p, g 和y,要求去求某个x(离散对数)的值,满足等式y = gx modp,这种情况下,计算的难度就会变得十分困难。同时在对于g和p的选择方面,也会对此类系统的安全产生较大的影响。人们为了确保无法解出离散对数的问题,数p应该是一个很大的素数,比如1024比特的大小,而且 (p-1)/2的值也应该是一个素数。同时整数序列如 g mod p,g mod p, g2mod p, …., gp-1 mod p中的p个元素均必须是不同的整数。
    在实际应用中,即DH协议的实际运用方案[6]应该是:首先A与B先对p和g达成一致,将这两个内容作为公开参数公开出来,任何人都可以知道这两者的数值,然后A自行选取一个私人的整数a,这个整数a作为私密数值,不能让其他人知道,然后A选择发送给B一个计算结果即M=ga mod p,因为这个M值没有进行加密操作,因此它可以被任何人接收到,和A进行相似的操作,B也自己取一个私密性的整数b,发给A计算结果N=gb mod p,同样这个N值也会被公开给所有人看到,A通过计算算出S=Na mod p=(gb)a mod p=gab mod p。同理B也可以计算出S=Na mod p=(gb)a mod p=gab mod p。这样A和B就同时互相得到了S的值,而这个S值就是A和B需要使用的共享密钥,所以说虽然其他人可以看到p、g、M和N这些数值,但是由于计算离散对数的困难性,其他人也就无法通过计算得知a和b的具体值,由于其他人无法得到a和b这两项重要数据的具体值,所以其他人也就无法得知密钥S的具体数值。

    哈希函数

    Hash,一般翻译做散列、杂凑,或者直接音译为哈希,哈希函数就是把任意长度的输入通过算法变换成固定长度的输出值,这个输出出来的值就是哈希值。这种转换实际上是一种压缩的映射,即哈希值的空间大小通常是远远小于输入值的空间大小的,并且不同的输入值可能也会哈希成相同的输出值,由于这个性质,人们不可能从哈希值来确定是否有唯一的输入值。简单的说哈希函数就是一种将任意长度的消息压缩到某一固定长度的摘要的函数,它通常是一个短的随机数字字母的字符串,并且当消息的输入发生任何改变都会使得哈希值发生变化。当获得哈希值输出之后,我们会将生成的哈希值附在要发送的消息的后面,这样,接收方就可以使用相同的哈希算法来计算这个收到的消息的哈希值,进而进行消息的验证。而将哈希函数用于消息验证,必须可有效计算性、单向性、抗弱碰撞性、抗强碰撞性等特点[7]。我们比较常见的哈希算法有MD5、SHA2等算法,如图为算法的消息传递过程。

    MD5算法是在1991年由Rivest开发出来的,在MD4的基础上增加了safety-belts的概念,这使得MD5算法更加安全。同时MD5有着很好的抗修改性,并且实现了很好的断点续传能力,即当目前我需要发送一个较大的文件,那么在客户端方面,MD5算法会把这个文件逐步分割成多个平均的小文件,然后客户端会选择在上传的过程中,上传两个MD5算法得到的哈希值,其中一个哈希值是当前上传的文件片段的MD5算法哈希值,还有一个哈希值是将两部分文件进行拼接操作之后得到的缝合文件的MD5哈希值,我们可以假设现在客户端正在上传的文件是客户端拆分出来的自前向后第二片拆分的文件,那么客户端发送的这个MD5哈希值就可以是第一片被拆分出来的文件再加上第二片被拆分出来的MD5哈希值,这样可以有效的保证被发送文件的完整性。而且当这个文件传输的过程中断了,服务器可以根据验证已经收到的文件的MD5哈希值来判断从客户端传过来的文件的传输进度,这样也在同时进行了已接收文件的验证工作,通过这种方式MD5算法实现断点续传的功能。但是在2004年8月的国际密码学会议(Crypto’2004)上,知名学者王小云提出了一种快速找到MD5碰撞的方法,降低了 MD5 的安全性,因此人们开始寻求更加安全可靠的算法。
    SHA-2(Secure Hash Algorithm 2)算法,SHA-2算法是一种标准,关于密码哈希函数演算方面方法的标准,这个算法的研发在国际上是该美国国家安全局负责的,通过美国国家安全局的相关研究与努力,终于在2001年在美国国家标准与技术研究院(NIST)的领导下面向世界发布了这个算法。同时SHA-2算法是属于SHA演算法家族中的一员,SHA-2算法也是是SHA-1算法的改进方向与继承算法。在SHA-2算法的下面又可以进行细分,将SHA-2算法划分成了六个不一样的标准,分别包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。SHA-2相对来说是安全的,至今尚未出现对SHA-2有效的攻击。

    结论

    通过对于OTR协议的研究与学习,分析OTR协议的相关内容,深入理解该协议,首先必须要承认的是,OTR协议具备诸多优点,无论是OTR协议特色的的前向加密性,还是基本可以实现的不可追溯性等等,这让许多知名的密码学人士去对它进行扩展与维护,这是一个相对而言,安全可靠的协议,但是它也的确存在一定的不足之处,OTR协议在密钥认证身份的步骤上是容易受到中间人攻击的,通信双方的身份信息因此是可能被伪造的,总的来说,本文的目的就是尝试对OTR协议中的身份认证交换部分进行改进,尝试把改进后的OTR协议可以实现安全的数据传输,新的身份认证交换环节的改进思路主要是来自SIGMA协议,本文选择的是使用AES算法和数字签名以及哈希函数的方式,主要选择传输使用AES加密后的公钥,但是AES算法的密钥是通过哈希运算获取的哈希值来决定的,主要是使用的哈希算法一对一的数据结构关系来确保密钥的正确性。同时本文使用具体的工程代码对方案进行验证,确定了方案的可行性,但是我认为还是存在很多不足,目前OTR协议在不断的向多方通信的趋势上扩展,这也是契合当下通信的发展方向的,因此本文所采取的OTR协议改进方案存在着一定的局限性,它最好的使用在本文看来是可以作为点对点的数据传输,即作为其他协议的附属部分来使用,在多方通信中尝试为每一个一对一的通信提供保护,因此在我看来,目前还在研发中的群组OTR方案将会是未来OTR协议发展的一个很好的方向,并且当今社会,发展是日新月异的,曾经被称之为完美的MD5算法也被王小云教授破解了,因此完美的安全是不存在,或许很快OTR协议就会被攻破,总的来说,在未来的时间里,相关人士依然要加强对OTR协议的拓展与完善,根据时代的进程不断的对OTR协议本身进行改进与优化的工作,这样才能使得OTR协议能够在任何时代都可以是一项值得信赖的安全协议。

  • 相关阅读:
    Python小白的数学建模 ---- 系列课程
    Maven学习笔记
    JavaScript 中的 Var,Let 和 Const 有什么区别
    (鸡汤文)搞懂了 JavaScript 定时器 setTimeout() 的 this 指向!
    setTimeout返回值的验证,(〒︿〒) 请原谅我一直以来对你的忽视
    终于把初中到大学的数学知识梳理完了(学习算法必备数学知识)
    最简单入门深度学习
    机器学习基本流程
    Vue.js源码解析-Vue初始化流程
    最大公约数&最小公倍数
  • 原文地址:https://www.cnblogs.com/lsqz/p/13233433.html
Copyright © 2020-2023  润新知