加密算法和哈希算法

文章正文
发布时间:2024-10-26 09:36

  以前加密算法只知道md5和SHA-1,SHA-2,今年查阅资料,把常见的算法,简单的总结了一下,至少休息的日子不能闲着把,大家元旦快乐。

  总所周知,加密算法分为二大类,对称加密算法,非对称加密算法,不过还得把不是加密算法的哈希算法加上,因为在我们工作中广泛被使用。

  此文部分摘自魏绰博客园的加密算法。

  一。对称加密

   对称加密算法操作过程如下图:

  

发送方与接收方用同一个随机对称密钥进行加密数据和解密数据

首先发送方生成随机对称密钥对数据进行加密后,连同密钥一同发送给接收方,接收方收到后用同一个密钥解密数据,并抛弃密钥。对称密钥在使用过一次后就被抛弃。

优点:速度比较快

缺点:

容易被黑客在中间拦截,并解密数据。 

不适用于数字签名

密钥每用一次都被抛弃,需要重复的生成密钥,这样对密钥的管理压力会很大。

  基于“对称密钥”的加密算法主要有DES、TripleDES、RC2、RC4、RC5和Blowfish等。

  

2。非对称加密算法

非对称加密算法操作过程如下图:

非对称性算法会生成一个公/私钥对,公钥加密数据只能用私钥解开;反之私钥加密数据,只能用公钥解开;

优点:

安全性比对称加密要高,在加密数据传输过程中,不传输密钥,所以即使数据被中途拦截,黑客没有密钥也不无法解开数据.

支持数字签名

缺点:速度慢,加密后的密文较长,非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比非对称加密慢上1000倍。

常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)

三,哈希算法:    

  例图如下:

概括来说,哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要)。

我们再说哈希算法和加密算法的区别:

1. 哈希算法往往被设计成生成具有相同长度的文本,而加密算法生成的文本长度与明文本身的长度有关。

2. 哈希算法是不可逆的,而加密算法是可逆的。

现在,我们在讨论下哈希和加密算法的选择问题:

基本原则是:如果被保护数据仅仅用作比较验证,在以后不需要还原成明文形式,则使用哈希;如果被保护数据在以后需要被还原成明文,则需要使用加密。

例如,你正在做一个系统,你打算当用户忘记自己的登录口令时,重置此用户口令为一个随机口令,而后将此随机口令发给用户,让用户下次使用此口令登录,则适合使用哈希。实际上很多网站都是这么做的,想想你以前登录过的很多网站,是不是当你忘记口令的时候,网站并不是将你忘记的口令发送给你,而是发送给你一个新的、随机的口令,然后让你用这个新口令登录。这是因为你在注册时输入的口令被哈希后存储在数据库里,而哈希算法不可逆,所以即使是网站管理员也不可能通过哈希结果复原你的口令,而只能重置口令。

相反,如果你做的系统要求在用户忘记口令的时候必须将原口令发送给用户,而不是重置其口令,则必须选择加密而不是哈希。

现在最常用的哈希算法,

  当前最常用的哈希算法是MD5和SHA1,下面给出在.NET平台上用C#语言实现MD5和SHA1哈希的代码,由于.NET对于这两个哈希算法已经进行很很好的封装,因此我们不必自己实现其算法细节,直接调用相应的库函数即可(实际上MD5和SHA1算法都十分复杂,有兴趣的可以参考邪恶的维基百科)。

我一般加密登录信息时,对密码加密采用如下方式:
1.先用账号(account)进行MD5或者SHA1,然后截取出DES的key。
2.用截取出的key,采用DES加密密码(password)。
这样做,在我目前涉及到的多个项目里面,没出现问题。好处是A的密码000000和B的密码000000加密后是不同的,相对安全一点。

以前是采用salt的,但是考虑到有的用户需要找回密码,salt的话,不可逆了。

再介绍下md5加盐,

用户注册时,

用户输入【账号】和【密码】(以及其他用户信息);
系统为用户生成【Salt值】;
系统将【Salt值】和【用户密码】连接到一起;
对连接后的值进行散列,得到【Hash值】;
将【Hash值1】和【Salt值】分别放到数据库中。
用户登录时,

用户输入【账号】和【密码】;
系统通过用户名找到与之对应的【Hash值】和【Salt值】;
系统将【Salt值】和【用户输入的密码】连接到一起;
对连接后的值进行散列,得到【Hash值2】(注意是即时运算出来的值);
比较【Hash值1】和【Hash值2】是否相等,相等则表示密码正确,否则表示密码错误。
有时候,为了减轻开发压力,程序员会统一使用一个salt值(储存在某个地方),而不是每个用户都生成私有的salt值。

可见,密码学是非常神秘的数学分支。