这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密算法。
文章的具体内容包括:序言,对称密钥加密(分组密码、DES、3DES、AES),非对称密钥加密(RSA、ECC、数字签名),消息摘要算法(MD5、SHA、MAC、HMAC),编码(Base64),破解(暴力破解法、字典攻击、彩虹表、旁道攻击、中间人攻击、长度扩展攻击、重放攻击、碰撞攻击、代数攻击),引用。
序言
BI应用的主要对象是对数据安全非常敏感的企业,这就要求我们在Mobile BI的开发过程中要特别注意对数据的存储、通信、验证等进行保护,而加密算法可以防止数据的读取、确保数据的完整性以及实现身份认证,这篇文章对应用普遍的加密算法进行简单的介绍,以便在后继Mobile BI安全功能的讲解中可以对安全功能实现的理论基础有一个清晰的认知。
加密算法可以简单的分为“对称密钥加密算法”和“非对称密钥加密算法”,这是以加解密过程中使用的密钥是否相同来区分的:
- “对称加密算法”是指加密和解密使用同一个密钥,一般而言,算法的强度与密钥的长度成正比,涉及的加密算法包括:AES、DES、Triple DES、RC2、RC4、IDEA、Camellia等。
- “非对称密钥加密算法”是指加密和解密使用不同的密钥,通常包括两个密钥,一个公钥,可以对外公开,一个私钥,只有自己知道,这种算法现在的主要应用是在开放且不安全的网络上认证身份。这里涉及的加密算法包括:RSA、DSA、Diffie-Hellman等。
此外,如果不需要保证消息可以被完整的读取出来,只需要验证消息本身,还有消息摘要这类算法。摘要算法多用于信息的比对和验证,使得在不暴露原始信息,以及缩小比对量的情况下保证结果的正确性,这里涉及的算法包括:MAC、MD5、SHA1、SHA256等。
对称密钥加密
对称密钥加密 Symmetric Key Algorithm 又称为对称加密、私钥加密、共享密钥加密:这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单的相互推算的密钥,对称加密的速度一般都很快。
分组密码
分组密码 Block Cipher 又称为“分块加密”或“块加密”,将明文分成多个等长的模块,使用确定的算法和对称密钥对每组分别加密解密。这也就意味着分组密码的一个优点在于可以实现同步加密,因为各分组间可以相对独立。
与此相对应的是流密码:利用密钥由密钥流发生器产生密钥流,对明文串进行加密。与分组密码的不同之处在于加密输出的结果不仅与单独明文相关,而是与一组明文相关。
分组密码的工作模式 Block cipher mode of operation 描述加密每一个数据块的过程,包括加密和认证的过程:
初始化向量
初始化向量 IV Initialization Vector 用于将加密随机化,以便同样的明文被多次加密也会产生不同的密文。
IV通常不需要保密,但不应该在使用同一密钥的情况下使用同一个IV。重用IV在CBC和CFB下会导致泄露明文首个块的某些信息,而在OFB和CTR下会导致完全失去安全性。
填充
填充 Padding,块密码只能对确定长度的数据块进行处理,而消息的长度通常都是可变的,因此在一些模式下,比如ECB、CBC,需要对最后一块数据在加密前进行填充。
位填充:在信息后添加一个“设定”位"1",再添加“重设”位"0"至要求大小。此方法可用于填充任意长度的信息。... | 1011 1001 1101 0100 0010 0111 0000 0000 |
字节填充:用于可编码为整数字节大小的信息
- ANSI X.923:使用"0"填充,直到最后一个字节定义填充的界限或者填充的字节数
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
- ISO 10126:使用随机数填充,直到最后一个字节定义填充的界限
... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
- PKCS7:使用需要填充的字节数为值来填充
... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |
- Zero Padding:直接使用"0"来填充
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
电子密码本
电子密码本 ECB Electronic Codebook 模式:需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。这个模式的优点在于模式简单、有利于并行计算、误差也不会被传递;但问题在于同样的明文块会被加密成相同的密文块,因此不能很好的隐藏数据模式。
可以参考下图,这种模式比较容易受到重放攻击[Replay attack]:(https://en.wikipedia.org/wiki/Replay_attack)的威胁
密文分组链接
密文分组链接 CBC Cipher Block Chaining 模式:这种模式要求消息填充,以便保证每一个明文块都是完整的一块,每个明文块先与前一个密文块进行异或后加密,这样每个密文块都依赖于它前面的所有明文块,而对于第一个块,需要使用初始化向量。这种模式的优点在于较好的安全性,但是加密过程是串行的,也就是不利于并行运算,可导致误差传递,但是反过来的话,从相邻的两个密文块即可得到一个明文块,所以解密的过程是可以并行的。
填充密码块链接
填充密码块链接 PCBC Propagating Cipher Block Chaining, 或称为明文密码块链接 Plaintext Cipher Block Chaining:可以使密文中的微小更改在解密时导致明文大部分错误的模式,并在加密的时候也具有相同的特性,这种方式主要用于Kerberos V4。
密文反馈
密文反馈 CFB Cipher Feedback 模式类似于CBC,可以将块密码变为自同步的流密码,工作过程也类似,CFB的解密过程即使颠倒的CBC的加密过程。这种模式隐藏了明文模式,使得分组密码转化成了流模式,可以及时加密传送小于分组的数据,而不需要数据填充。而缺点与CBC类似,加密不能并行化,但解密可以。
输出反馈
输出反馈模式 OFB Output Feedback 将块密码变成同步的流密码,用产生的密码流的块,与明文块做异或,得到密文。同样的,这种模式隐藏了明文模式,使得分组密码转化成了流模式,可以及时加密传送小于分组的数据,而不需要数据填充,而缺点是不能并行化。
计数器模式
计数器模式 CTR Counter Mode 同样将块密码变为流密码,通过递增一个加密计数器以产生连续的密钥流,加解密过程均可以进行并行处理。
DES、3DES
数据加密标准 DES Data Encryption Standard 是由IBM在美国国家安全局NSA授权下研制的一种使用56位密钥的分组密码算法,并于1977年被美国国家标准局NBS公布成为美国商用加密标准。但是因为DES固定的密钥长度,逐渐的不再符合在开放式网络中的安全要求,已经于1998年被移出商用加密标准,被更安全的AES标准替代。
DES使用的Feistel Network网络属于对称的密码结构,对信息的加密和解密的过程极为相似或趋同,使得相应的编码量和线路传输的要求也减半。
DES是块加密算法,将消息分成64位,即16个十六进制数为一组进行加密,加密后返回相同大小的密码块,这样,从数学上来说,64位0或1组合,就有2^64种可能排列。DES密钥的长度同样为64位,但在加密算法中,每逢第8位,相应位会被用于奇偶校验而被算法丢弃,所以DES的密钥强度实为56位。
3DES Triple DES,使用不同Key重复三次DES加密,加密强度更高,当然速度也就相应的降低。
AES
高级加密标准 AES Advanced Encryption Standard 为新一代数据加密标准,速度快,安全级别高。由美国国家标准技术研究所NIST选取Rijndael于2000年成为新一代的数据加密标准。
AES的区块长度固定为128位,密钥长度可以是128位、192位或256位。AES算法基于Substitution Permutation Network代换置列网络,将明文块和密钥块作为输入,并通过交错的若干轮代换"Substitution"和置换"Permutation"操作产生密文块。
AES加密过程是在一个4*4的字节矩阵(或称为体State)上运作,初始值为一个明文区块,其中一个元素大小就是明文区块中的一个Byte,加密时,基本上各轮加密循环均包含这四个步骤:
AddRoundKey
“合并”:矩阵中的每个字节与该回合密钥做XOR亦或运算,其中回合密钥由主密钥通过Rijndael密钥生成方案生成,这个密钥大小跟原矩阵一致。
SubBytes
“替换”:矩阵中的每个字节通过一个8位查找表对应的特定字节所替换。这里的8位查找表为S-box(Substitution-box, 置换盒),用来模糊密钥与密文之间的关系,实现输入输出的非线性特征。
ShiftRows
“行混淆”:矩阵中的每一行的各个字节循环向左方位移,位移量随行数递增。
MixColumns
“列混淆”:每一列的四个字节通过线性变换互相结合,即与一个固定的多项式做乘法。
安全性
已知的针对AES唯一的成功攻击是旁道攻击,2005年时使用缓存时序攻击法,破解了一个装载OpenSSL AES加密系统的客户服务器。
针对区块加密系统最常见的方式,是通过对加密循环次数较少的版本尝试攻击,然后改进算法后继续攻击高级版本,目前这个破解方法还不太实用。
另外由于AES的数据结构具有井然有序的代数结构,有一个担心就是相关的代数攻击,目前基于此的有效攻击方法也暂时没有出现。
非对称密钥加密
非对称密钥加密 Asymmetric Key Cryptography 也可称为 Public Key Cryptography 公开密钥加密:需要两个密钥,分为公钥和私钥,一个用作加密而另外一个只能用于解密,而加密的密钥并不能用来解密。
根据此特性,除了加解密的应用外,还可以确保数字签名的功能:某用户用私钥加密明文,任何人都可以用该用户的公钥解密密文,以此判定身份。
对称密钥需要一个安全的渠道可以交换共用的密钥,而非对称密钥可以讲加密公钥公开发布;不过公钥加密在计算上相当复杂,性能远比不上对称加密,所以一般会利用公钥加密来交换对称密钥,然后依靠对称密钥来传输具体的信息。
RSA
RSA是由三个人的名字组成 Ron Rivest、Adi Shamir、Leonard Adleman于1977年在MIT提出,并于1987年公布,是目前最常用的公钥加密算法。
RSA算法的核心是极大整数的因式分解,理论基础在于由两个大质数算出乘积很容易,但是要从一个极大整数因式分解得出两个质数却很难。
RSA算法
随机选取两个不相等的质数 p、q
计算p、q的乘积 n = p*q
计算n的欧拉函数 𝞿(n) = (p-1)(q-1)
p、q会被销毁
随机选取整数e,满足条件 1<e<𝞿(n),且e与𝞿(n) 互质
计算e对于𝞿(n)的模反元素,整数d: ed ≡ 1 (mod 𝞿(n))
这样n、e、d即为密钥相关数值,而通过幂运算取余实现加解密:
公钥 (n, e): 信息 m 实现加密 c mᵉ ≡ c (mod n)
私钥 (n, d): 密文 c 实现解密 m cᵈ ≡ m (mod n)
欧拉函数:𝞿(n)是指小于n的正整数中与n互质的数的数目,而欧拉函数符合积性函数,这也就意味着𝞿(n)=𝞿(pq)=𝞿(p)𝞿(q)
,而p\q为质数,也就意味着所有小于p\q的数都与p\q互质,也就是𝞿(p)=p-1, 𝞿(q)=q-1
,这样最终可以得到公式𝞿(n) = (p-1)(q-1)
模算数的同余关系 a≡b(mod n)
是指对于正整数n,两个整数a和b对于模n同余。
模反元素、模逆元是指存在整数d,使得ed被𝞿(n) 除的余数为1,即ed ≡ 1 (mod φ(n))
,等价于ed - 1 = kφ(n)
,而一般为得到d,即是对ex + φ(n)y = 1
这个二元一次方程求解。
欧拉定理表明若n、a为正整数且互质,则a^φ(n) ≡ 1(mod n)
。具体的证明加解密函数的正确性可以参见RSA算法原理
相比其他对称算法,RSA要慢得多。在密钥分配过程中,信息可能通过“中间人攻击”被截取,所以一般需要通过可靠的第三方机构签发证书来防止这种攻击。另外一种被称为“时间攻击”的方法,根据对特定消息加密时所需要的时间来判断对应的加密信息,这是因为RSA里面加密时所作的模指数运算是一个比特一个比特进行的,而比特为1时所花的运算比比特为0时的运算多很多,利用这个特性可以推导私钥的内容。当然,最通用的破解是大数因式分解,这个取决于计算机的计算能力。
ECC
ECC即 Elliptic Curve Cryptography 椭圆曲线密码学,是基于椭圆曲线数学建立公开密钥加密的算法。ECC的主要优势是在提供相当的安全等级情况下,密钥长度更小。
ECC的原理是根据有限域上的椭圆曲线上的点群中的离散对数问题ECDLP,而ECDLP是被因式分解问题更难的问题,是指数级的难度。而ECDLP定义为:给定素数p和椭圆曲线E,对Q=kP,在已知P,Q 的情况下求出小于p的正整数k。可以证明由k和P计算Q比较容易,而由Q和P计算k则比较困难。
是不是有点绕,好吧,我数学也差不多忘光了,了解一下是什么就可以了~~
数字签名
数字签名 Digital Signature 又称公钥数字签名是一种用来确保数字消息或文档真实性的数学方案。一个有效的数字签名需要给接收者充足的理由来信任消息的可靠来源,而发送者也无法否认这个签名,并且这个消息在传输过程中确保没有发生变动。
数字签名的原理在于利用公钥加密技术,签名者将消息用私钥加密,然后公布公钥,验证者就使用这个公钥将加密信息解密并对比消息。一般而言,会使用消息的散列值来作为签名对象。
消息摘要算法
散列函数 Hash Function 又可称为散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数具有一个基本特性:如果两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果,而相应的散列函数即被称为单向散列函数。但是如果散列值相同,两个输入值可能相同也可能不同,这种情况成为散列碰撞。
密码散列函数 Cryptographic Hash Function 又可称为加密散列函数、密码散列函数,属于散列函数的一种,是一种单向函数,它将一个不定长的输入数据转换成固定大小的结果,并且以这个结果很难回推输入的数据。这种散列函数的输入数据,通常被称为消息Message,而输出的结果,经常被称为消息摘要Message Digest或摘要Digest。总的来说,密码散列函数具有如下的重要特征:
- 具有确定性,即同样的消息输入具有同样的散列结果。
- 对于任何一个给定的消息,能够快速运算出散列数值
- 难以由一个已知的散列数值,去推算原始的消息
- 对于消息的任何微小的改动,都会导致散列结果的巨大改变
- 两个不同的消息输入,一定会产生不同的散列数值
除了被用作传统的哈希函数,而在数据索引、指纹等方面应用外,密码散列函数在信息安全方面有很多的应用,包括数字签名、消息认证码、以及各种形式的认证。
MD5
消息摘要算法 MD5 Message Digest Algorithm 是一种密码散列函数,可以产生出一个128位,即16字节的散列值,用于确保信息的完整性。MD5由MD4、MD3、MD2改进而来,主要是增强了算法的复杂度和不可逆性。MD5目前已被证实无法防止碰撞攻击,所以不适用于安全性认证,即不可用于SSL公开密钥认证、数字签名等方面。但是MD5具有简单、稳定、快速的特征,所以在一些普通数据的错误检查应用中依然被广泛应用,比如文件下载的MD5校验和。
MD5以512位分组处理输入的信息,每一组又被划分为16个32位子分组,经过特定的程序流程,生成四个32位分组数据,最终这四组数据结合成128位的散列值作为最终的结果。
具体的算法过程为:
信息填充:使用起始1依次0的填充方式,将信息填充为对512求余为448,再加上最后一个64位的数字代表填充前的信息长度,最终结果为512的整数倍。
链接变量:MD5拥有4个32位的链接变量Chaining Variable作为整数参数 A=0x01234567
, B=0x89abcdef
, C=0xfedcba98
, D=0x76543210
这其实是一个固定的常量状态
四轮循环:每轮循环的次数即是信息中512位信息分组的数目,而每轮循环分别采用如下图中的一种函数
如图所示为一次MD5运算:MD5的四轮循环共包括64次此种运算,每轮由16次MD5运算构成。这里的F是一个非线性函数,一个函数用在一次循环中。Mi代表32位的输入消息块,Kj代表32位的常量,<<<s代表左位移s位,"田"字代表模加运算。
简单地说,MD5算法的核心其实就是用512位的信息块来改变128位链接变量的状态,最终的状态即是128输出散列值。
SHA
安全散列算法 SHA Secure Hash Algorithms 包括一个密码散列函数家族,是FIPS所认证的安全散列算法。
SHA-0:1993年发布,160位散列函数,存在严重缺陷被很快撤回,为SHA-1的前身。
SHA-1:1995年发布,160位散列函数,类似于MD5的算法,在很多安全协议中广为使用,比如TLS、SSL、SSH等,被视为MD5的后继者,2015年被Google正式宣布攻破。
SHA-2:2001年发布,拥有两组散列函数,包括32位字的SHA-256以及64位字的SHA-512,它还包括各种变种SHA-224、SHA-384、SHA-512/224、SHA-512/256(后缀数字即散列位数),尚未被有效攻破,但算法与SHA-1类似。
SHA-3:2005年发布,支持SHA-2的相同散列长度,但内部结构得到很大的更新,作为一个未来可替换的加密散列算法存在。
目前主流使用SHA-2,比如SHA-256,其算法过程与MD5类似:
- 首先SHA-256对于输入报文有最大不超过2^64位的限制,输入依然按照512位分组,产生的是256位的报文摘要。
- 填充比特位以1开始顺位0,直至模512至448位,最后64位位原始报文的长度。
- 初始状态变量为256位,为8个32位
A=0x6A09E667
,B=0xBB67AE85
,C=0x3C6EF372
,D=0xA54FF53A
,E=0x510E527F
,F=0x9B05688C
,G=0x1F83D9AB
,H=0x5BE0CD19
- 循环计算处理512位输入报文分组,每组迭代64次计算
与MD5类似,简单地说,SHA256算法的核心就是用512位的信息块来改变256位链接变量的状态,最终的状态即是256输出散列值。
MAC
消息认证码 MAC Message Authentication Code,又称为消息鉴别码、文件消息认证码、讯息鉴别码、信息认证码等,是指经过特定算法后产生的一小段信息,通过验证消息传递过程中是否遭到更改以检查某段消息的完整性,以及作为消息来源的身份验证的一种方式,确认消息的来源。
MAC不会对信息保密,若要同时实现保密认证,需要同时对信息进行加密。在实际应用中,通常会使用带密钥的散列函数HMAC,或者块密码的带认证工作模式CBC-MAC。
这幅图示表明消息的发送者通过MAC算法生成一个MAC的数据标签,然后随原始消息一同发给接收者,而接收者通过同样的MAC算法生成另外一个MAC数据标签,比较这两者就可以判定消息是否在传输过程中被修改,从而判定数据传输的完整性。
在这里需要避免重放攻击 Replay Attacks,消息本身需要包含一些信息以便保证同样的消息不会被重复发送,这种信息可以是时间戳、序号码、或者一次性MAC等。
MAC与数字签名的不同之处在于,MAC值的生成和验证都是通过同一个密钥实现的,所以发送者和接收者在建立连接前就需要确认密钥,这与对称密钥类似。这也就意味着验证法同样可以生成签名,所以签名认证的意义就没有了。
HMAC
密钥散列消息认证码 HMAC Keyed Hash Message Authentication Code 使用密码散列函数,结合一个加密密钥,计算生成消息认证码。HMAC既可以用来保证数据的完整性,也可以用作某个消息的身份验证。
MD5、SHA都可以作为HMAC的散列算法被使用,相应的HMAC算法就可以被称为 HMAC-MD5, HMAC-SHA。
如图所示,HMAC-SHA1的生成由两个散列计算过程构成,首先密钥会被用来生成两个密钥 (Inner、Outer),第一个计算过程利用输入消息和Inner密钥生成内部散列值,而第二个计算过程会利用内部散列值和outer密钥生成最终的散列值作为结果。这种方式可以有效地抵制长度扩展攻击。
编码
Base64
Base64 是一种基于64个可打印字符来表示二进制数据的表示方法,2的6次方为64,即以6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即三个字节可表示4个可打印字符。
Base64严格意义不能算是一种加密方式,只是将文本变得不那么可以直接看出来而已。
在Base64中可打印字符包括A-Z、a-z、0-9,总计62,再加上可能因系统而不同的两个可打印字符。Base64常用于处理文本数据的场合,处理一些二进制数据,比如MIME的email、在XML中存储数据等。
MIME
在MIME格式的电子邮件中,Base64可以将二进制的字节序列数据编码成ASCII字符序列构成的文本,使用时除了字母和数字外,加上加号"+"和斜杠"/",共计64个字符,等号"="用作后缀。另外,在电子邮件中,每76个字符后需要加一个回车换行,另外使用"="补足尾部不足3字节的部分。
破解
暴力破解法
暴力破解法 Brute-force attack 又可称为穷举法,即攻击者会系统性的尝试所有可能的密码,直到找到真正的密码为止。暴力破解的有效性取决于密码的长度、复杂度等,如果暴力破解的耗时过长,就会导致破解没有意义。与此相对应,为避免受到暴力破解的攻击,我们可以添加一些防护手段,比如:增加密码的长度与复杂度、在系统中限制密码试错的次数、定时修改密码等。
字典攻击
比暴力破解优化点的一种方式叫做字典攻击Dictionary Attack,这种方法就是给密码锁定某个范围,比如英文单词、生日的数字组合等,所有的英文单词大约10万个左右,这样就可以大大缩小密码的查找范围,相比暴力破解可以缩短破译时间。
字典攻击是根据现有或常用的组合测试破解密码。
彩虹表
彩虹表 Rainbow Table 是一个用于加密散列函数逆运算的预先计算好的表,常用于破解加密过的密码散列。这种方式常用于包含有限字符固定长度纯文本密码的加密,是一种典型的以空间换时间的方式,相比暴力破解使用较少的计算能力而更多的存储空间。它可以针对各种散列算法,已被确认有效的包括MD5和SHA-1,一般主流的彩虹表都在100G以上。
彩虹表是针对特定的算法,尤其是不对称算法,比如MD5,进行有效破解的一种方法。
彩虹表采用哈希链的存储方式存储字典,它只需要保存这个链的首位的值,而中间值是通过哈希函数进行推算,这样可以对时间和空间进行平衡。一种比较好的理解方式是:暴力破解是将所有可能都列出来一一尝试,而彩虹表是按照某些规律和特征分组,当发现某个特征符合当前情况时,在这一个方向上细化继续尝试相关的可能性。
哈希链
假设存在哈希函数H和有限密码集合P
`H(p) = h`表示P集合里的元素p经哈希函数生成结果
归约函数R:影射散列值h在集合P中对应的密码p,非H的反函数
哈希链:使用归约函数和哈希函数行程交替链
aaaaaa -H-> 281DAF40 -R-> sgfnyd -H-> 920ECF10 -R-> kiebgt
存储时只保存起点aaaaaa和终点kiebgt
对于需要破解的哈希值920ECF10
应用函数R得到 920ECF10 -R-> kiebgt
因为对应终点,可以得到起点aaaaaa
再计算哈希链
aaaaaa -H-> 281DAF40 -R-> sgfnyd -H-> 920ECF10 -R
从而确认密码为sgfnyd
实际使用中,哈希链并不总会包含所需要查找的哈希值,并且以h开始的链可能会和起点在h链之后的某个查找链重合。这种无法查找的情况被称为误报。这种简单的哈希链存在很多缺陷,其中有一个问题就是,如果两条链中的任何两个点碰撞了,他们后续的所有点都将重合,这会导致查找表不能够覆盖足够多的密码。
为了解决简单的哈希链中的碰撞问题,彩虹表选用一系列相关的衰减函数R1、R2... Rk来代替原先的衰减函数R。这样如果发生碰撞后,可以找出重点相同的链,并生成新的链来补充表。从而避免链的重合而降低碰撞的次数。不过这也意味着我们需要计算k条不同的链。
实际应用方面,某些网站的用户密码数据库泄露,攻击者就可以通过使用彩虹表破解数据库中存储的密码散列值,当然,如果存的是明文密码的话~~~ 就无话可说了。对于彩虹表的防御,一般可以使用加盐Salt的方式,改变哈希函数的形式,如果函数形式变了,而彩虹表是针对特定哈希函数而生成的,那么现有的彩虹表就无效了。
旁道攻击
旁道攻击 Side-Channel Attacks 又称为旁路攻击、侧信道攻击:一种针对密码设备的新型攻击技术,基于从密码系统的物理视线中获取信息,比如时间信息、功率消耗、电磁泄露、声音等额外的信息来源。通过功率分析尝试破解RSA的实例就是通过RSA迭代是是否有惩罚而导致处理器功率发生变化的差异而用来分析加密密钥。
中间人攻击
中间人攻击 MITM Middle in the Middle Attack 是指攻击者秘密的传递并可能改变两方的通信,而通信双方仍然相信他们是直接通信的。
为了抵御在不安全的通道的通信需求,我们需要一些抵御中间人攻击的一些认证技术方案:公钥基础建设PKI使用公认的数字证书认证机构CA认证通信端;延迟测试的预估时间的超出等。
长度扩展攻击
长度扩展攻击 Length Extension Attack 针对某些允许包含额外信息的加密散列函数的攻击手段。该攻击方法适用于在消息与密钥长度已知的情况下,所有采取了H(密钥||消息)此类构造的散列函数,包括MD5、SHA-1、SHA-2等,而HMAC、SHA-3不受此影响。
攻击的原理在于散列函数的算法会使用输入消息改变内部处理函数的状态,而这个状态最终生成输出的散列摘要,因此存在着从散列摘要重新构建内部状态、并用于处理攻击者伪造的数据的可能性。从而,攻击者得以扩充消息的长度,并为新的伪造消息计算出合法的散列摘要。
重放攻击
重放攻击 Replay Attack 是一种通过欺骗性的重复发送或者延迟有效消息的网络攻击手段。
防止重放攻击的一个手段是使用在加密信息片段上附上会话ID和编号,使用这种唯一且随机的标签,使得攻击者不能简单的重放信息。其他的方法包括一次性密码、时间戳等。
碰撞攻击
碰撞攻击 Collision Attack 是指找出两个不同的输入值却导致同样的散列值的一种方式,目前已经可以有效地攻击MD5和SHA-1。
有效地利用碰撞,可以使得所有数据全部碰撞,人为的将哈希表变成一个退化的单链表,使得各种操作的时间均提升了一个数量级,因此大量消耗CPU资源,导致系统无法快速响应请求,从而达到拒绝服务供给Dos的目的。
代数攻击
与传统的“统计”攻击方法不同,使用代数方法对密码体制进行密码分析的攻击方法叫做代数攻击:将加密活动描述为输入密钥和输出之间的多元方程组,并通过求解低次超定稀疏方程组来回复密钥。它的优势在于所需要的数据量非常少。
代数攻击适用于所有的加密方式,前景很好,但是现有的研究还不太充分。
又是一个需要深厚数学功底的例子~~