一、Base64
百度百科:
Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾去掉填充的’=’号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
此外还有一些变种,它们将“+/”改为“-”或“.”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。
其他应用
Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码
Base64 也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。
垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。
在LDIF档案,Base64用作编码字串。
Base64算法,它是电子邮件常用的传输算法。电子邮件只允许使用ASCII码,而对于非ASCII码(如中文)就显得无能为力了。因此,为了能在电子邮件中使用非ASCII码,就有了Base64算法。
Base64算法算不上真正的加密算法,尽管Base64算法的编码和解码操作可充当加密和解密操作,还有一张字符映射表充当了秘钥。但是,Base64算法公开秘钥,而且加密强度并不高。尽管如此,经过改良的Base64算法常常作为加密算法使用,如修改字符映射表。
Base64算法广泛用于电子邮件传输、网络数据传输、秘钥存储和数字证书存储。经过改良的Base64算法常作为网络数据传输二进制数据,甚至可以作为一种简单的加密手段。
二、验证数据完整性——信息摘要算法
1、MD5算法
百度百科:
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5算法已被破解,虽然MD5算法的破解使其安全性大为降低,但在用户注册/登录模块中仍然是架构师首选的方案。各大软件厂商在其软件下载页面上仍然使用MD5算法作为数据完整性验证的首选方法。MD5算法常作为安全性要求不高的环境中的常用算法。
2、SHA算法
百度百科:
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。
SHA算法较之MD算法更为安全,常常出现在一些安全系数要求较高的环境中。一般的用户注册/登录模块,各大软件厂商用于校验数据完整性的页面中都常常用到SHA算法。这些领域既是MD5算法出没的地方,也是SHA算法盘踞之处。除此之外,MD5和SHA算法还常常作为数字证书的签名算法,而SHA算法则更为常见一些。
3、MAC算法
百度百科:
消息认证码(带密钥的Hash函数):密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。构造方法由M.Bellare提出,安全性依赖于Hash函数,故也称带密钥的Hash函数。消息认证码是基于密钥和消息摘要所获得的一个值,可用于数据源发认证和完整性校验。
MAC是一种基于秘钥的散列函数算法,它吸收了MD算法和SHA算法的精髓,并将其发扬光大。
4、循环冗余校验算法——CRC算法
百度百科:
循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。
MD、SHA和MAC都是加密算法领域的信息摘要算法,与之功能相近的CRC-23算法则是最为古老的数据完整性验证算法。目前,CRC-23算法仍广泛用于通信领域,实现差别控制,其变种Adler-32算法则广泛适用于zlib压缩算法中。
三、初等数据加密——对称加密算法
1、DES算法
百度百科:
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。
DES算法有三点安全隐患:秘钥太短、迭代偏少和半公开性。
针对秘钥太短和迭代偏少的问题,有人提出了多重DES的方式用来克服这些缺陷,在实际应用中一般采用3DES方案,它还有两个别名——Triple DES和DESede。
DESede算法将秘钥长度增至112位或168位,抗穷举攻击的能力显著增强。但究其核心仍是DES算法,虽然增加迭代次数提高了安全性,但与此同时也造成了处理速度较慢,秘钥计算时间加长,加密效率不高的问题。
2、AES算法
百度百科:
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
DESede算法的种种劣势宣告DES算法改良路线失败,对称加密算法前途陷入困境,迫切需要产生新的对称加密算法,AES算法和IDEA算法呼之欲出。
以其秘钥设置快、存储要求低、在硬件实现和限制存储的条件下性能优异当选AES算法。AES算法支持3种长度的秘钥,为128位、192位和256位。基于较高的安全性,AES常被用于通用移动t通信系统。
3、特点
对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。
不足之处是,交易双方都使用同样钥匙,安全性得不到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。而与公开密钥加密算法比起来,对称加密算法能够提供加密和认证却缺乏了签名功能,使得使用范围有所缩小。在计算机专网系统中广泛使用的对称加密算法有DES和IDEA等。美国国家标准局倡导的AES即将作为新标准取代DES。
四、高等数据加密——非对称加密算法
对称加密算法提高数据安全性的同时带来了秘钥管理的复杂性。消息收发双方若想发送加密消息,必须事先约定好加密算法并发放秘钥。加密算法在传递过程中,难免会被窃听。如果窃听者破译了秘钥,就可以破译、甚至篡改消息,而消息的收发双方却浑然不知。当然,我们可以通过消息摘要算法验证消息的完整性,但却不能避免消息被破译的可能。消息收发双方所要避免这种密码被破解的风险,就必须频繁更换秘钥,而秘钥的发送又是一个敏感的问题,操作起来具有一定的难度。
非对称加密算法构建了两把秘钥:私钥保密,成为私钥;公钥公开,成为公钥。公钥和私钥一一对应,且不能相互推导得出,即便公钥在传输过程中被截获也不能推导出私钥。也就是说,即便公钥被截获或被破解,也无法推到对应的私钥。非对称加密算法普遍遵从“公钥加密,私钥解密”和“私钥加密,公钥解密”这两种加密方式。
主要算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
使用最广泛的是RSA算法,Elgamal是另一种常用的非对称加密算法。
Elgamal由Taher Elgamal于1985年发明,其基础是DiffieˉHellman密钥交换算法,后者使通信双方能通过公开通信来推导出只有他们知道的秘密密钥值[DiffieˉHellman]。
与RSA相比,DiffieˉHellman的优势之一是每次交换密钥时都使用一组新值,而使用RSA算法时,如果攻击者获得了私钥,那么他不仅能解密之前截获的消息,还能解密之后的所有消息。然而,RSA可以通过认证(如使用X.509数字证书)来防止中间人攻击,但Diff ieˉHellman在应对中间人攻击时非常脆弱。
五、带秘钥的消息摘要算法——数字签名算法
数字签名算法是公钥基础设置(PKI)以及许多网络安全机制(SSL/TLS、VPN等)的基础。
数字签名算法要求能够验证数据完整性、认证数据来源,并起到抗否认的作用。
基于数据完整性认证,我们希望数据的发送方(以下简称甲方)可以对自己所发送的数据做相应的处理(签名处理),同时给出对应的凭证(签名),并且数据的接收方(以下简称乙方)可以验证该签名是否与数据甲方发送的数据相符。
如果任何机构都可以进行签名处理,那签名本身就失去了验证的意义。因此,签名操作只能由甲方来完成,验证签名操作则由乙方来完成。既然签名操作仅限于甲方,那么签名操作本身是基于甲方的某些私有信息完成的操作。并且,用于验证操作的相关信息是由甲方公布给乙方。
用于签名的相关信息私有,用于验证的相关信息共有,且这两种信息必须成对出现。非对称加密算法中的私钥和公钥满足这种关系,成为数字签名算法中的重要元素。
数字签名算法包含签名和验证两项操作,遵循“私钥签名,公钥验证”的签名/验证方式,签名时需要使用私钥和待签名数据,验证时则需要公钥、签名值和待签名数据,其核心算法主要是消息摘要算法。因此,我们可以把数字签名算法近似看成是一种附加了公钥和私钥的消息摘要算法。
数字签名算法主要包括RSA、DSA和ECDSA共3种算法。
RSA算法是目前使用最为广泛的非对称加密算法和数字签名算法,在电子商务和产品验证方面均有使用。
DSA算法是继RSA算法后出现的基于DSS的数字签名算法,旨在形成数字签名标准。并且,DSA算法本身不包含任何信息摘要算。DSA算法主要为后续数字签名算法的形成奠定基础。
ECDSA算法相对传统签名算法具有速度快、强度高、签名短等优点,其用途也越来越广泛。
六、参考
《Java加密与解密的艺术》