通过编程的方式,可以使用密码系统来加强Web应用的安全性。在“密码系统和数字证书”这一章节中,我们已经简要介绍了密码系统。这一节,我们将分项介绍不同的加密方法。
每个加密算法的目标是,尽量增加不使用密钥就能解密的难度。选择加密算法时,应该选择经受时间考验并成功抵御了所有攻击的算法,此外,还要考虑需要的是速度还是更强的安全性。在某些情况下,需要限制哈希值的长度。常见的加密算法有哈希算法(这里姑且将散列数据作为一种加密算法分类)、对称加密、不对称加密。
一、哈希算法
散列数据得到的一串值被称为哈希值,关于哈希值的概念,在之前的“密码系统和数字证书”章节中已经介绍过,这里不再赘述。常见的哈希算法有:MD2、MD4、MD5、SHA-1、SHA-256、SHA384、SHA512、RIPEMD、Haval等。它们具备不同的哈希算法,能够产生不同长度的哈希值。
1、MD2、MD4
MD是Message Digest Algorithm的简称,中文名消息摘要算法,目前最新为第五版即MD5,历史版本有MD2、MD4。MD2算法产生于1989年,MD4算法产生于1990年,它们都由于存在缺陷(主要表现为大量的哈希值冲突,即不同的字符串,得到的哈希值是相同的),都已不再使用。消息摘要算法各个版本间的结果是不一样的。
Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验将和MD2产生冲突。
为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。
2、MD5
MD5算法产生于1991年。MD5是目前广泛使用的版本,主流编程语言基本都有现成的MD5加密函数。MD5虽然名声在外,不过其安全性多年前就开始被质疑(碰撞算法)。于是在2008年提出了MD6算法,其后MD6历经数次改进,目前还是试行方案阶段,未被正式使用。
1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。
MD5算法大致的四个过程是:第一步,填充。处理后,信息长度恰好是512的整数倍。第二步,初始化变量。初始的128位值为初始链接变量,以大端字节序来表示。第三步,处理分组数据。经过四轮循环运算,得到新的数据。第四步,输出。
MD5有如下优点,使得其广泛流行:
- 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
- 2、容易计算:从原数据计算出MD5值很容易,现有的计算机编程语言都有实现MD5的方法。
- 3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
- 4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
- 5、完全免费:不需要缴纳任何版权税。
2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。(注:并非是真正的破解,只是加速了杂凑冲撞)按照她的算法,理论上在数个小时内就可以找到MD5碰撞。因此,单纯MD5的密文(如存在数据库里经过加密的密码)一旦泄露,就将面临被冒充和替换的危险。
破解MD5之后,2005年2月,王小云教授又破解了另一国际密码SHA-1。
你可以使用本站的MD5加密工具进行在线加密。
3、SHA-1
SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家标准与技术研究院(NIST)和美国国家安全局 (NSA) 开发的标准哈希算法,发布于 1993年。两年之后, SHA-1,第一个 SHA 的后继者发布了。 另外还有四种变体,曾经发布以提升输出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2)。
最初载明的算法于1993年发布,称做安全散列标准 (Secure Hash Standard),FIPS PUB 180。这个版本常被称为 "SHA-0"。它在发布之后很快就被NSA撤回,并且以 1995年发布的修订版本 FIPS PUB 180-1 (通常称为 "SHA-1") 取代。根据 NSA的说法,它修正了一个在原始算法中会降低密码安全性的错误。SHA-1已经被公众密码社群做了非常严密的检验而还没发现到有不安全的地方,它在一段时间被认为是安全的,直到Google宣布攻破SHA-1。
SHA-0 和 SHA-1 会从一个最大 2^64 位元的讯息中产生一串 160 位元的摘要,然后以设计 MD4 及 MD5 讯息摘要算法的 MIT 教授Ronald L. Rivest类似的原理为基础来加密。
SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。
你可以使用本站的SHA加密进行在线SHA-1、SHA-256、SHA-512加密。
4、RIPEMD
RIPEMD(RACE Integrity Primitives Evaluation Message Digest,RACE原始完整性校验消息摘要),是Hans Dobbertin等3人在md4、md5的基础上,于1996年提出来的。算法共有4个标准:128、160、256和320,其对应输出长度分别为16字节、20字节、32字节和40字节。不过,让人难以致信的是RIPEMD的设计者们根本就没有真正设计256和320位这2种标准,他们只是在128位和160位的基础上,修改了初始参数和s-box来达到输出为256和320位的目的。所以,256位的强度和128相当,而320位的强度和160位相当。RIPEMD建立在md的基础之上,所以,其添加数据的方式和md5完全一样。
5、HAVAL
HAVAL加密算法是由Yuliang Zheng、Josef Pieprzyk和Jennifer Seberry在1992提出。HAVAL加密算法可以产生不同长度的散列值,包括128位、160位、192位、224位、256位。并且可以指定生成散列计算的轮数(3、4或5)。128位3轮计算的HAVAL密钥已被证实是不安全的。
二、对称加密
对称加密算法使用单一的、数据发送者和接受者实现约定好的私钥,加密和解密数据都使用这个密钥。常见的对称加密方法有:DES/3DES(TripleDES)、RC2/RC4、Rijndael(即AES)。
通常情况下,块加密算法(类似RC2/RC4、DES、3DES、Rijndael)每次将N个字节的输入块转换为字节加密后的输出块。如果要加密或解密某个比较长的数据,必须将其分块进行。由于N很小(通常为8、16、24或者32个字节),因此一旦某个数据长度大于N,就必须分块加密,一次处理一个块。
对称加密有着先天性的优点:算法公开、计算量小、加密速度快、加密效率高、可逆。但缺点同样明显:双方使用相同钥匙,安全性得不到保证。由于对称加密速度上的优势,在很多场合都需要对称加密。
1、DES/3DES
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。目前被AES取代。
3DES(即Triple DES)是DES向AES过渡的加密算法,它使用2个56位的密钥对数据进行三次加解密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。执行三次DES算法的过程是:加密-解密-加密,相应的解密的过程是:解密-加密-解密。
采用两个密钥进行三重加密的好处有:①两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为168bit的三个密钥,会产生不必要的开销。②加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样有效的实现了与现有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一样,有助于逐渐推广三重DES。③三重DES具有足够的安全性,目前还没有关于攻破3DES的报道。
2、RC2/RC4
RC2是由著名密码学家Ron Rivest(大名鼎鼎的RSA中的R)设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。它的输入和输出都是64比特。密钥的长度是从1字节到128字节可变,但目前的实现是8字节(1998年)。
RC2的后继方法为RC4,RC4加密算法是Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。RC4也被叫做ARC4(Alleged RC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法。
RC4在早先就被曝存在一类弱密钥,使得密文易被破译。因为RC4流密钥是一次一密,每个C-S的连接的密钥都是不一样的,也因此,当连接数足够多的时候,必然会出现弱密钥。其128位仍不能达到一般可接受的安全水平。Github从2015年1月5日将停止对RC4的支持,RC4作为一种老旧的验证和加密算法易于受到黑客攻击。这意味着,用户在使用Windows XP系统上的IE浏览器时将无法进入Github网站。
3、Rabbit
Rabbit流密码是由Cryptico公司设计的,密钥长度128位,最大加密消息长度为264 Bytes,即16 TB,若消息超过该长度,则需要更换密钥对剩下的消息进行处理。它是目前安全性较高,加/解密速度比较高效的流密码之一,在各种处理器平台上都有不凡的表现。
4、Rijndael(AES)
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。Rijndael是由比利时密码学家Joan Daemen和Vincent Rijmen用他们早期所设计的Square改良而来;而Square则是由SHARK发展而来。
严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。加密过程中使用的密钥是由Rijndael密钥生成方案产生。
AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。AES加密有很多轮的重复和变换。大致步骤如下:1、密钥扩展(KeyExpansion),2、初始轮(Initial Round),3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(Final Round),最终轮没有MixColumns。
你可以使用本站的对称加密/解密进行在线加密,这个工具集合了上面提到的几个工具。
三、不对称加密
不对称加密又称为非对称加密,其算法需要两个密钥:公开密钥(public key)和私有密钥(private key)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥。但是由于其算法复杂,而使得加密解密速度远没有对称加密解密的速度快,对大型数据加密时间很长,一般用于小数据(比如对称加密的密钥)。
非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等,其中RSA应用极为广泛。
RSA算法
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战和质疑。
RSA是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密公钥,甚至,加密算法和解密算法也都是公开的,但就是基于基本而有效的数学理论,使得RSA算法成为不对称加密乃至整个密码学的常青树。
为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,被普遍认为是最优秀的公钥方案之一。
RSA加解密的算法完全相同。RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2×e1)≡1(mod(p-1)×(q-1))。(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
RSA算法密钥生成的大致过程是:首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。除此之外这样找到的p和q还要满足一定的要求,首先它们不能太靠近,此外p-1或q-1的因子不能太小,否则的话N也可以被很快地分解。此外寻找质数的算法不能给攻击者任何信息,这些质数是怎样找到的,尤其产生随机数的软件必须非常好。要求是随机和不可预测。这两个要求并不相同。一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出p和q一半的位的话,那么他们就已经可以轻而易举地推算出另一半。此外密钥d必须足够大,1990年有人证明假如p大于q而小于2q(这是一个很经常的情况)而,那么从N和e可以很有效地推算出d。此外e = 2永远不应该被使用。
由于进行的都是大数计算,使得RSA最快的情况也比DES慢上好几倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。RSA的速度比对应同样安全级别的对称密码算法要慢1000倍左右。所以RSA算法一般被用来加密对称加密的密钥。这样,只传送对称加密的密钥,接收方在收到密钥后,使用RSA解密被加密过的对称密钥,然后再使用这个对称密钥解密被对称加密的大量其他信息。
RSA算法最有可能受到的攻击有:密钥分配攻击(将自己公钥冒充为他人公钥,交给第三方,该攻击可以被数字认证防范)、时间攻击(通过加密时间反推出私钥的内容,需要对硬件时间了解到变态精细的程度)、模数攻击(如:同一信息用不同的公钥加密,这些公钥共模而且互质,那么该信息无需私钥就可得到恢复)、边信道攻击(不是直接对RSA的算法本身进行攻击,而是针对计算RSA的设备的攻击。现今的边信道攻击一般是针对硬件实现RSA算法的芯片进行的。该攻击可以以牺牲效率为代价防范)、暴力破解(对大质数进行暴力计算破解,理论上可以100%破解RSA的密钥,但需要的时间可能是几百上千年,但量子计算机或许给RSA的安全性带来致命伤害)。
RSA的优点明显,但缺点也同样突出:1)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。2)安全性,RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价(意味着人们可以通过除分解大数意外的方式攻击RSA加密的可能性依然存在)。3)速度太慢,由于RSA 的分组长度太大,为保证安全性,n 至少也要 600 bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。安全电子交易协议(即SET,Secure Electronic Transaction)协议中要求CA采用2048比特长的密钥,其他实体使用1024比特的密钥。
上文提到的暴力破解,已经有相当大的进展:1999年,RSA-155(512bits)被成功分解,花了五个月时间(约8000 MIPS 年)和224 CPU hours 在一台有3.2G中央内存的Cray C916计算机上完成。2002年,RSA-158也被成功因数分解。2009年12月12日,编号为 RSA-768 (768bits,232 digits)数也被成功分解。但至少,商用的至少1024位的密钥目前还算安全。CA的2048位短时间内也难以攻破。
2013年2月15日上午消息,据《纽约时报》周二报道,欧美数学家和密码学家偶然发现,被全世界广泛应用的公钥加密算法RSA存在漏洞。他们发现,在700万个实验样本中有2.7万个公钥并不是按理论随机产生的。也就是说,或许有人可以找出产生公钥的秘密质数。该研究项目是由美国独立密码学家James P.Hughes和荷兰数学家Arjen K. Lenstra牵头的。他们的报告称:“我们发现绝大多数公钥都是按理论产生的,但是每一千个公钥中会有两个存在安全隐患。”报告称,为防止有人利用该漏洞,有问题的公钥已从公众访问的数据库中移除。为确保系统的安全性,网站需要在终端做出改变。
四、数字签名
数字签名将哈希值与加密相结合,以确保消息的完整性并验证发送者的身份。使用数字签名签名数据的步骤:
- 对数据进行哈希运算来创建哈希值。
- 使用用户私钥加密哈希值,从而创建数字签名。
接收方解密、验证数据的步骤是:
- 接受者使用发送者的公钥解密签名数据,恢复成哈希值。
- 对传递的数据进行哈希运算来创建第二个哈希值。
- 将两个哈希值进行比对。如果哈希值匹配,接受者就可以确信数据来源于发送方,且数据没有被修改。
转载本站内容时,请务必注明来自W3xue,违者必究。