为了防止自己的信息完全裸露在别人面前,就需要对信息进行加密。加密就是把明文以某种方式变换成一堆看起来乱七八糟的数据--密文,再把密文发给对方,对方收到之后,用对应的方法再用相应的方法再数据还原成明文(解密)。对信息进行加密的步骤就是加密算法。
有些算法本身,除了要输入明文之外,还需要输入另一个专门的数据(密钥)才能输出密文。现代的加密系统,一般都由加密算法和密钥组成。没有密钥的加密系统也是有的,但保密性和实用性相对来说比较差。比如一旦组织中有人离开,那么所有人都要更换加密算法,否则安全性就无法保证了。而带密钥的加密系统解决了这个问题。因为即使算法公开,没有密钥也无法解密密文信息,而密钥的更换比算法的更换要容易得多。
使用密码学可以达到以下目的:保密性:防止用户的标识或数据被读取。数据完整性:防止数据被更改。身份验证:确保数据发自特定的一方。
常见的加密算法分类:
分类方法一:按照加密算法密钥是否对称,分成三类:对称加密算法,非对称加密算法和Hash算法。
对称式加密加密和解密使用同一个密钥,通常称之为“SessionKey”。这种加密技术目前被广泛采用,如美国政府所采用的DES加密标准就是一种典型的“对称式”加密法,它的SessionKey长度为56Bits。
非对称式加密加密和解密所使用的不是同一个密钥,而是两个密钥:一个称为“公钥”,另一个称为“私钥”;它们两个必须配对使用,否则不能打开加密文件。这里的“公钥”是指可以对外公布的,“私钥”则只能由持有人本人知道。它的优越性就在这里,因为如果是在网络上传输加密文件,对称式的加密方法就很难把密钥告诉对方,不管用什么方法都有可能被别人窃听到。而非对称式的加密方法有两个密钥,且其中的“公钥”是可以公开的,不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题。
最典型的可逆加密算法是异或运算。大家都知道,对一个值连续异或两次,其结果还是原值;于是,第一次异或被看成是加密,第二次异或被看成是解密。
对EXE进行加密必须使用一些可逆的加密算法,即不仅能加密数据,还要能还原数据。下面我们就自行开发一种简单的可逆加密算法。
不可逆加密算法的特征是,加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文。这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。
为了避免有人通过可逆算法得到加密前的信息,在用户权限认证的系统中,通常会使用一张不可逆加密的表,表中存放着经过加密以后的用户密码。这个密码是任何人也破解不了的,除非被他有幸猜中,虽然不能还原最初的密码,但可以通过对用户密码的再一次加密实现用户密码的验证。
举个最简单的例子:假设用户最初输入的密码是“123456”,使用的不可逆加密算法是将每一位当成一个数字,然后与3相除,取余数作为每一位加密后的结果,最终用户密码被加密成“120120”。很显然,你无法正确地还原回去,因为许多原始密码经过这种加密算法得到的值都是“120120”,如原始密码为“789123”、“456123”等。但是,这种加密算法却可以用在对用户的验证上,即用户只要输入“123456”,其加密以后的值一定是表中存储的值。
很明显,在这类加密过程中,加密是自己,解密还得是自己;而所谓解密,实际上就是重新加一次密,所应用的“密码”也就是输入的明文。
不可逆加密算法不存在密钥保管和分发问题,非常适合在分布式网络系统上使用,但因加密计算复杂,工作量相当繁重,通常只在数据量有限的情形下使用,例如,广泛应用在计算机系统中的口令加密,利用的就是不可逆加密算法。
近年来,随着计算机系统性能的不断提高,不可逆加密的应用领域正在逐渐增大。在计算机网络中应用较多不可逆加密算法的有许多,例如RSA公司发明的MD5算法,以及由美国国家标准局建议的不可逆加密标准SHS(SecureHashStandard,安全散列信息标准)等。
带密钥的加密算法一般分为两类:对称加密算法和非对称加密算法。
为了解决对称加密算法的问题,牛X的人发明了非对称加密算法。在非对称加密算法中,存在两个密钥。一个是加密密钥(e),一个解密密钥(d)。通过e对明文加密得到的密文,只有用d来解密出来还原成明文。而且算法本身可以保证,就算你知道e,想要得到d也是非常非常困难的。既然有这种特性,那么我们就可以这样做:我把加密密钥公布出去(发给通信的对方A)。A收到密钥e以后,用e对他要发送的信息(M)进行加密得到密文C发送给我,我再使用解密密钥d把密文解密,还原成M。在这个过程中,我并不担心第三方的窃听者窃听我们的通信过程,因为就算他有了e,也无法使用e来解密C。除了解密密钥d的拥有者(我)之外,谁都无法解密。这样,我只要保证d的只有我知道(这个相对容易做到),就可以保证通信的安全。
①、常见的对称加密算法:DES、AES、3DES、IDEA、DESX、RC4、RC5、RC6和Blowfish
对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。
②、常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、ElGamal、DSA(数字签名用)
非对称密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。
③、常见的Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1
注意:
Hash算法和MAC算法主要用来防篡改
数字签名算法主要用来进行身份认证和抗抵赖
算法推荐使用:
1.禁止使用业界已知不安全的加密算法,DES/3DES(除密钥K1,K2,K3三个密钥完全不同外的场景)/RC2/RSA(1024位及以下)/MD2/MD4。
2.禁止MD5算法应用参与生成“数字签名”,口令加密保存这两种场景;禁止SHA1应用参与生成“数字签名”的场景
3.推荐使用如下算法:
对称加密算法建议使用:AES(128位及以上);
非对称加密算法推荐使用:RSA(2048位及以上);
哈希算法推荐使用:SHA2(256位及以上);
HAMC(基于哈希的消息验证码)算法建议使用:HAMC_SHA2
缺省选择安全的加密算法。
非对称加密算法介绍:
DHDiffie-Hellman算法(D-H算法),密钥一致协议。是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想。简单的说就是允许两名用户在公开媒体上交换信息以生成"一致"的、可以共享的密钥。换句话说,就是由甲方产出一对密钥(公钥、私钥),乙方依照甲方公钥产生乙方密钥对(公钥、私钥)。以此为基线,作为数据传输保密基础,同时双方使用同一种对称加密算法构建本地密钥(SecretKey)对数据加密。这样,在互通了本地密钥(SecretKey)算法后,甲乙双方公开自己的公钥,使用对方的公钥和刚才产生的私钥加密数据,同时可以使用对方的公钥和自己的私钥对数据解密。不单单是甲乙双方两方,可以扩展为多方共享数据通讯,这样就完成了网络交互数据的安全通讯!该算法源于中国的同余定理——中国馀数定理。
ECDSA椭圆曲线数字签名算法(ECDSA)设计的数学原理是基于椭圆曲线离散对数问题的难解性。EC点上离散对数的研究现状表明:所使用的ECDSA密钥至少需要192比特,才能保证有足够的中长期安全。RC2是由著名密码学家RonRivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。它的输入和输出都是64比特。密钥的长度是从8字节到128字节可变,但目前的实现是8字节(1998年)。
RC4RC4加密算法是大名鼎鼎的RSA三人组中的头号人物RonRivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。RC4也被叫做ARC4(AllegedRC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法。
RC5RC5密码是1994由麻萨诸塞技术研究所的RonaldL.Rivest教授发明的。它是一种非常快速且简单的算法由块尺寸,轮数,和密钥长度参数化。这些参数能被调整以满足不同的安全目的,性能和出口能力。合并的RSA数据安全已经归档了RC5密码的专利的申请和RC5,RC5-CBC,RC5-CBC-Pad,RC5-CTS并分类了各种变更
DESDES(DataEncryptionStandard)对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;数据加密算法(DataEncryptionAlgorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的。通常,自动取款机(AutomatedTellerMachine,ATM)都使用DEA。它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使用费而使用。1977年被美国政府正式采纳。还有DES2和DES3等算法。
IDEAIDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法,使用128位密钥提供非常强的安全性。IDEA(InternationalDataEncryptionAlgorithm)是瑞士的JamesMassey,XuejiaLai等人提出的加密算法,在密码学中属于数据块加密算法(BlockCipher)类。IDEA使用长度为128bit的密钥,数据块大小为64bit。从理论上讲,IDEA属于“强”加密算法,至今还没有出现对该算法的有效攻击算法
SKIPJACKSkipjack分组加密算法是由美国国家安全局(NSA)从1985年开始设计,1990年完成评估,于1993年由美国政府正式对外宣布的,是"Capstone"(美国政府根据1987年国会通过的计算机安全法案所订立的长远计划)中的一个项目(另外三个项目分别是数字签名标准(DSA)、安全散列函数(SHA)及密钥交换方法)。Skipjack算法曾经被列为“机密”等级。
TWOFISH在1972到1974年中,NationalBureauofStandards(现在更名为NationalInstituteofStandardsandTecnology,缩写为NIST)首次公开征求一种标准的数据加密算法,结果产生了DES(DataEncryptionStandard)加密算法。
SHASHA(即SecureHashAlgorlthm,安全散列算法)是一种常用的数据加密算法.它由美国国家标准与技术局(NatlonalInstituteofStandardsandTechnology)于1993年作为联邦信息处理标准公布(即第一代SHA算法——SHA-0)。在1995年和2002年.其改进版本SHA-1、SHA-2也分别正式公布(SHA-1和SHA-2具有比SHA-0更高的安全性)。SHA算法与MD5算法的设计原理类似.同样也按2blt数据块为单位来处理输入
SHA-1SHA-1杂凑算法起初是针对DSA算法而设计的,其设计原理与RonRivest提出的MD2,MD4,尤其是MD5杂凑函数的设计原理类似。
ECC2000年10月,国际密码学界在德国ESSEN召开了学术大会(ECC2000),在这次会议上,来自世界各国的密码学家、数学家证明了对ECC算法的最快破解效率是高于亚指数级的,而RSA算法的最快破解效率是亚指数级的。ECC2000的召开进一步从学术上奠定了ECC算法的安全性,极大的推动了它在世界各国的应用。
MD2Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验将和MD2产生冲突。MD2算法加密后结果是唯一的-----即没有重复。
MD4MD4是麻省理工学院教授RonaldRivest于1990年设计的一种信息摘要算法。它是一种用来测试信息完整性的密码散列函数的实行。其摘要长度为128位。这个算法影响了后来的算法如MD5、SHA家族和RIPEMD等。
MD5MD5的全称是Message-DigestAlgorithm5(信息-摘要算法),在90年代初由MITLaboratoryforComputerScience和RSADataSecurityInc的RonaldL.Rivest开发出来,经MD2、MD3和MD4发展而来。
HMAC_SHA1HMAC_SHA1(HashedMessageAuthenticationCode,SecureHashAlgorithm)是一种安全的基于加密hash函数和共享密钥的消息认证协议。它可以有效地防止数据在传输过程中被截获和篡改,维护了数据的完整性、可靠性和安全性。
HMAC_SHA1消息认证机制的成功在于一个加密的hash函数、一个加密的随机密钥和一个安全的密钥交换机制。
HMAC_SHA1其实还是一种散列算法,只不过是用密钥来求取摘要值的散列算法。
HMAC_SHA1算法在身份验证和数据完整性方面可以得到很好的应用,在目前网络安全也得到较好的实现
SCB2SCB2算法是国家密码管理局推出的一款对称分组密码算法,与以往的对称分组密码算法相比具有安全性高,加解密性能快等特点,因此目前SCB2算法成为国家主管部门在商用密码领域主力推广使用的对称分组密码算法。SCB2算法可以用于各种文件传输过程中进行加解密的安全文件传输系统。目前,该领域主要有使用县乡专用SCB2算法的安全文件传输系统如:SJY117和使用通用SCB2算法的安全文件传输系统
SSF33国内的一些行业应用智能卡规范中,凡是涉及到CPU卡的大多会提到采用SSF33算法。但是目前在任何公开的资料中始终不能找到SSF33算法的详细内容,开始的时候大家都疑窦丛生,后来也就习以为常见怪不怪了。因为虽然规范中定义了SSF33算法,但是在实际应用中几乎都不使用这套算法。尤其是针对那些需要在国际间实现互联互通的领域,比如银行卡方面,从来就没用过SSF33算法。
小知识之HMAC:
HMACSHA1是从SHA1哈希函数构造的一种键控哈希算法,被用作HMAC(基于哈希的消息验证代码)。此HMAC进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混合,然后再次应用哈希函数。输出的哈希值长度为160位。
在发送方和接收方共享机密密钥的前提下,HMAC可用于确定通过不安全信道发送的消息是否已被篡改。发送方计算原始数据的哈希值,并将原始数据和哈希值放在一个消息中同时传送。接收方重新计算所接收消息的哈希值,并检查计算所得的HMAC是否与传送的HMAC匹配。
因为更改消息和重新生成正确的哈希值需要密钥,所以对数据或哈希值的任何更改都会导致不匹配。因此,如果原始的哈希值与计算得出的哈希值相匹配,则消息通过身份验证。
SHA-1(安全哈希算法,也称为SHS、安全哈希标准)是由美国政府发布的一种加密哈希算法。它将从任意长度的字符串生成160位的哈希值。
HMACSHA1接受任何大小的密钥,并产生长度为160位的哈希序列。
加密算法的选择
我们应该根据自己的使用特点来确定,由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。
对称加密算法不能实现签名,因此签名只能非对称算法。
由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。
在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
如果在选定了加密算法后,那采用多少位的密钥呢?一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。
二.加密算法介绍
对称加密算法
对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:
DES(DataEncryptionStandard):数据加密标准,速度较快,适用于加密大量数据的场合。
3DES(TripleDES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
AES(AdvancedEncryptionStandard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;
AES与3DES的比较
算法名称
算法类型
密钥长度
速度
资源消耗
AES
对称block密码
128、192、256位
高
1490000亿年
低
3DES
对称feistel密码
112位或168位
46亿年
中
非对称算法
RSA:由RSA公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
DSA(DigitalSignatureAlgorithm):数字签名算法,是一种标准的DSS(数字签名标准);
ECC(EllipticCurvesCryptography):椭圆曲线密码编码学。
ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面:
抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。
计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。
存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。
带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。
下面两张表示是RSA和ECC的安全性和速度的比较。
RSA/DSA(密钥长度)
ECC密钥长度
RSA/ECC密钥长度比
104
512
106
5:1
108
768
132
6:1
1011
1024
160
7:1
1020
2048
210
10:1
1078
21000
600
35:1
RSA和ECC安全模长得比较
功能
SecurityBuilder1.2
BSAFE3.0
163位ECC(ms)
1,023位RSA(ms)
密钥对生成
3.8
4,708.3
签名
2.1(ECNRA)
228.4
3.0(ECDSA)
认证
9.9(ECNRA)
12.7
10.7(ECDSA)
Diffie—Hellman密钥交换
7.3
1,654.0
RSA和ECC速度比较
散列算法
散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。
单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:
lMD5(MessageDigestAlgorithm5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。
lSHA(SecureHashAlgorithm):可以对任意长度的数据运算生成一个160位的数值;
SHA-1与MD5的比较
因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
l对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
l对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
l速度:在相同的硬件上,SHA-1的运行速度比MD5慢。
对称与非对称算法比较
以上综述了两种加密方法的原理,总体来说主要有下面几个方面的不同:
l在管理方面:公钥密码算法只需要较少的资源就可以实现目的,在密钥的分配上,两者之间相差一个指数级别(一个是n一个是n2)。所以私钥密码算法不适应广域网的使用,而且更重要的一点是它不支持数字签名。
l在安全方面:由于公钥密码算法基于未解决的数学难题,在破解上几乎不可能。对于私钥密码算法,到了AES虽说从理论来说是不可能破解的,但从计算机的发展角度来看。公钥更具有优越性。
l从速度上来看:AES的软件实现速度已经达到了每秒数兆或数十兆比特。是公钥的100倍,如果用硬件来实现的话这个比值将扩大到1000倍。
三.加密算法的选择
由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。
那采用多少位的密钥呢?RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。
四.密码学在现代的应用
保密通信:保密通信是密码学产生的动因。使用公私钥密码体制进行保密通信时,信息接收者只有知道对应的密钥才可以解密该信息。
数字签名:数字签名技术可以代替传统的手写签名,而且从安全的角度考虑,数字签名具有很好的防伪造功能。在政府机关、军事领域、商业领域有广泛的应用环境。
秘密共享:秘密共享技术是指将一个秘密信息利用密码技术分拆成n个称为共享因子的信息,分发给n个成员,只有k(k≤n)个合法成员的共享因子才可以恢复该秘密信息,其中任何一个或m(m≤k)个成员合作都不知道该秘密信息。利用秘密共享技术可以控制任何需要多个人共同控制的秘密信息、命令等。
认证功能:在公开的信道上进行敏感信息的传输,采用签名技术实现对消息的真实性、完整性进行验证,通过验证公钥证书实现对通信主体的身份验证。
密钥管理:密钥是保密系统中更为脆弱而重要的环节,公钥密码体制是解决密钥管理工作的有力工具;利用公钥密码体制进行密钥协商和产生,保密通信双方不需要事先共享秘密信息;利用公钥密码体制进行密钥分发、保护、密钥托管、密钥恢复等。
基于公钥密码体制可以实现以上通用功能以外,还可以设计实现以下的系统:安全电子商务系统、电子现金系统、电子选举系统、电子招投标系统、电子彩票系统等。
根据密钥类型不同可以将现代密码技术分为两类:对称加密算法(私钥密码体系)和非对称加密算法(公钥密码体系)。
1对称加密算法中,数据加密和解密采用的都是同一个密钥,因而其安全性依赖于所持有密钥的安全性。对称加密算法的主要优点是加密和解密速度快,加密强度高,且算法公开.缺点是实现密钥的秘密分发困难,在大量用户的情况下密钥管理复杂,而且无法完成身份认证等功能,不便于应用在网络开放的环境中。对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。目前最著名的对称加密算法有数据加密标准DES,但传统的DES由于只有56位的密钥,因此已经不适应当今分布式开放网络对数据加密安全性的要求。欧洲数据加密标准IDEA等,目前加密强度最高的对称加密算法是高级加密标准AES,AES提供128位密钥,128位AES的加密强度是56位DES加密强度的1021倍还多。。
对称加密算法过程是将数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。不足之处是,交易双方都使用同样钥匙,安全性得不到保证。假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1)个密钥。
对称加密算法、非对称加密算法和不可逆加密算法可以分别应用于数据加密、身份认证和数据安全传输。
3不可逆加密算法
不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。显然,在这类加密过程中,加密是自己,解密还得是自己,而所谓解密,实际上就是重新加一次密,所应用的“密码”也就是输入的明文。不可逆加密算法不存在密钥保管和分发问题,非常适合在分布式网络系统上使用,但因加密计算复杂,工作量相当繁重,通常只在数据量有限的情形下使用,如广泛应用在计算机系统中的口令加密,利用的就是不可逆加密算法。近年来,随着计算机系统性能的不断提高,不可逆加密的应用领域正在逐渐增大。在计算机网络中应用较多不可逆加密算法的有RSA公司发明的MD5算法和由美国国家标准局建议的不可逆加密标准SHS(SecureHashStandard:安全杂乱信息标准)等。
比较著名的
1对称DES
2不对称RSA
3不可逆MD5
21.2加密算法
加密算法是EXE加密的核心。本节首先介绍了常用的两类加密算法,然后介绍了自行设计的可逆加密算法,并给出了加密代码。
21.2.1
2各类算法的优缺点
对称加密:加解密速度快密钥管理困难主要用于大数据量的加密
非对称加密:密钥管理方便加解密速度慢主要用于密钥交互密钥的管理
通常是对称加密、非对称加密、Hash算法解密相结合:
例如某流行IM软件的全流程加密过程:
服务器到客户端的回应信息:(后续数据交互过程加解密的KEY)采用的是AES128位KEY是密码MD5后前16个字符
此全流程数据的加密是三类加密算法的完美结合,也是一种非常完美的IM类软件的加解密方案。可以做为其他IM类软件解密方案模板。
“盐”值盐值也可以为您提供一层额外的安全保护。使用.NETFramework类RNGCryptoServiceProvider创建一个随机的数字字符串。RNG表示随机数生成器。该类可以创建一个任意长度的随机字节数组,长度可以被指定。根据盐值&口令一道提交加密。
浅谈MD5加密算法中的加盐值(SALT)
您是否遇见过破解不了的MD5值?你是否遇见过‘奇形怪状’的hash?这些非常有可能就是带有salt(俗称加盐值),本文将为大家简单的介绍关于加盐值的一些信息。
0×01.什么是加盐值为了加强MD5的安全性(本身是不可逆的),从而加入了新的算法部分即加盐值,加盐值是随机生成的一组字符串,可以包括随机的大小写字母、数字、字符,位数可以根据要求而不一样,使用不同的加盐值产生的最终密文是不一样的。
0×03.如何破解出带有加盐值的密文因为像windowshash(未进行syskey加密)、非加盐值MD5等都可以通过大型的密码(如彩虹表)表进行对比解密,所以相对而言相当的轻松,而带有加盐值的密文就相对而言复杂的多,现在的MD5表大概是260+G,如何加盐值的可能性有10000个,那么密码表的应该是MD5size*10000,就可以解密出原MD5表能够解密的密码了,一些网站也提供了对应的salt解密,但是测试以后效果并不是非常好,如常规的admin888也未解密出,实在是遗憾,毕竟MD5本是不可逆的,带入随机值解密出最终密码的可能性就更低了,至少是相对大多数人而言的。
1).修改adminuid为没有启用的某值
2).将自己的注册用户修改为adminuid的值
重新登陆,并成功获取权限,因为在站A中式依据uid来分配权限的,也就是给某uid管理员权限,如何而言轻松获取到管理员权限。
先说一下MD5吧!虽然md5算法是不可逆的,但是因为它对同一个字符串计算的结果是唯一的,所以一些人可能会使用“字典攻击”的方式来攻破md5加密的系统[5]。这虽然属于暴力解密,却十分有效,因为大多数系统的用户密码都不回很长。为了解决这个问题,我们可以使用盐值加密“salt-source”。
我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。
这里的“佐料”被称作“Salt值”,这个值是由系统随机生成的,并且只有系统知道。这样,即便两个用户使用了同一个密码,由于系统为它们生成的salt值不同,他们的散列值也是不同的。即便黑客可以通过自己的密码和自己生成的散列值来找具有特定密码的用户,但这个几率太小了(密码和salt值都得和黑客使用的一样才行)。
下面以PHP示例,讲解md5($pass.$salt)加密函数。
调用方式:$new_password=hash($_POST[password]);//这里接受表单提交值,并进行加密
下面详细介绍一下加Salt散列的过程。介绍之前先强调一点,前面说过,验证密码时要使用和最初散列密码时使用“相同的”佐料。所以Salt值是要存放在数据库里的。
用户注册时,
有时候,为了减轻开发压力,程序员会统一使用一个salt值(储存在某个地方),而不是每个用户都生成私有的salt值。
0×04.含加盐值MD5算法的应用目前多家的网站程序公司都已经加入了该算法,如常见的VBB论坛、discuz论坛等都采用了,甚至著名的Linux开源操作系统早已经加入了这种加密模式。可得而知,这种算法势必会在未来应用于更多的范围。
实际上,大多数系统都是用admin作为默认的管理员登陆密码,所以,当我们在数据库中看到“21232f297a57a5a743894a0e4a801fc3”时,就可以意识到admin用户使用的密码了。因此,md5在处理这种常用字符串时,并不怎么奏效。
为了解决这个问题,我们可以使用盐值加密“salt-source”。
修改配置文件:
盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字符串,再加上用户名,最后算出来的md5值就没那么容易猜出来了。因为攻击者不知道盐值的值,也很难反算出密码原文。
我们这里将每个用户的username作为盐值,最后数据库中的密码部分就变成了这样:
INSERTINTOUSERSVALUES('admin','ceb4f32325eda6142bd65215f4c0f371',TRUE)INSERTINTOUSERSVALUES('user','47a733d60998c719cf3526ae7d106d13',TRUE)
在SpringSecurity文档中有这么一句话:"盐值的原理非常简单,就是先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算,这样一来,就算密码是一个很常见的字符串,再加上用户名,最后算出来的md5值就没那么容易猜出来了。因为攻击者不知道盐值的值,也很难反算出密码原文。"
呵呵,问题如何理解这句话:"先把密码和盐值指定的内容合并在一起,再使用md5对合并后的内容进行演算".例如,在applicationContext-security.xml文件中的配置如下:
假设用户名是Tom,密码为123456,那么在数据库中存放的值应该是什么
通过查看SpringSecurity的org.springframework.security.providers.encoding.BasePasswordEncoder类可知SpringSecurity通过如下方式来匹配在数据库中已经被盐值加密的密码:
即通过password+"{"+salt.toString()+"}"中方式把"密码和盐值指定的内容合并在一起".所以对于用户名是Tom,密码为123456的用户在数据库中存放的密码应该为对"123456{Tom}"md5验算后的值:610c492873b994f96f93e342a56bcd68
给MD5加点“盐”虽然MD5加密很厉害,将信息泄露的概率降低到了非常小的程度,但我们这些做程序员的具有追求完美的天性,为了达到更高的安全级别,我们还需给MD5加点“盐”。所谓的加“盐”就是当用户注册填写密码时,让系统产生一个随机值,将这个值与用户密码连接在一起再使用MD5算法进行处理,这样就在很大程度上避免了攻击者通过字符对比得到特定密码的危险。
看来,向量的作用其实就是salt
最大的好处是,可以令到即使相同的明文,相同的密钥,能产生不同的密文
例如,我们用DES方式在数据保存用户密码的时候,可以另外增加一列,把向量同时保存下来,并且每次用不同的向量。这样的好处是,即使两个用户的密码是一样的,数据库保存的密文,也会不一样,就能降低猜测的可能性。
如基本的单向加密算法:
一般的加密通常都是块加密,如果要加密超过块大小的数据,就需要涉及填充和链加密模式,文中提到的ECB和CBC等就是指链加密模式。在C#组件中实现的很多算法和Java都不太兼容,至少我发现RSA和AES/ECB是如此。研究了AES/ECB时发现了这篇文档,图还画的不错,先记下。注意,还缺一种CTR的模式。
对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。MD5MD5--message-digestalgorithm5(信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。通过java代码实现如下:
给出一个完整类,如下:
再给出一个测试类:
控制台输出:
一,概述
散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(MessageAuthenticationCode)的鉴别机制。使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;HMAC还引人了一个散列函数H,对消息进行加密,进一步确保消息鉴别的安全性和有效性
本文档阐述了一种使用散列函数加密的消息验证机制——散列消息鉴别码HMAC。HMAC通过捆绑一个共享密钥可以使用任何迭代的可用于加密的散列函数。例如:MD5,SHA—1。这种加密机制的强度取决于所用散列函数的特性。
二,原理
基于散列函数的消息认证码。它需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个密钥K用以计算消息认证码。
计算HMAC需要一个散列函数hash(可以是md5或者sha-1)和一个密钥key。用L表示hash函数输出字符串长(md5是16),用B表示数据块的长度(md5和sha-1的分割数据块长都是64)。密钥key的长度可以小于等于数据块长B,如果大于数据块长度,可以使用hash函数对key进行转换,结果就是一个L长的key。
然后创建两个B长的不同字符串:
innerpad=长度为B的0×36
outterpad=长度为B的0×5C
计算输入字符串str的HMAC:
hash(key^outterpad,hash(key^innerpad,str))
三,应用:
hmac主要应用在身份验证中,它的使用方法是这样的:
3.客户端将该随机值作为密钥,用户密码进行hmac运算,然后提交给服务器
4.服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的hmac运算,然后与用户发送的结果比较,如果结果一致则验证用户合法
密钥用于HMAC的密钥可以是任意长度(比B长的密钥将首先被H处理)。但当密钥长度小于L时的情况时非常令人失望的,因为这样将降低函数的安全强度。长度大于L的密钥是可以接受的,但是额外的长度并不能显著的提高函数的安全强度。密钥必须随机选取(或使用强大的基于随机种子的伪随机生成方法),并且要周期性的更新。(目前的攻击没有指出一个有效的更换密钥的频率,因为那些攻击实际上并不可行。然而,周期性更新密钥是一个对付函数和密钥所存在的潜在缺陷的基本的安全措施,并可以降低泄漏密钥带来的危害。)
HMAC的典型应用
HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下:(1)先由客户端向服务器发出一个验证请求。(2)服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。(3)客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。(4)与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。SHA算法参数*SHA-2是一个系列包括SHA-224,SHA-256,SHA-384和SHA-512
HMAC算法安全性浅析
HMAC-SHA1是一种安全的基于加密hash函数和共享密钥的消息认证协议.它可以有效地防止数据在传输过程中被截获和篡改,维护了数据的完整性、可靠性和安全性.HMAC-SHA1消息认证机制的成功在于一个加密的hash函数、一个加密的随机密钥和一个安全的密钥交换机制.本文从HMAC和SHA1算法的概念入手,提出了一个基于SHA1算法的消息认证机制
一、简述
这里需要说明的是经过mac算法得到的摘要值也可以使用十六进制编码表示,其摘要值得长度与实现算法的摘要值长度相同。例如HmacSHA算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制数,换算成十六进制的编码为40位。