常见加密方案

1、对称加密

即加密方和解密方都使用相同的加密算法和密钥,这种方案的密钥的保存非常关键,因为算法是公开的,而密钥是保密的,一旦密匙泄露,黑客仍然可以轻易解密。 常见的对称加密算法有:AES、DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和 等。

2、非对称加密

即使用不同的密钥来进行加解密,密钥被分为公钥和私钥,用私钥加密的数据必须使用公钥来解密,同样用公钥加密的数据必须用对应的私钥来解密, 常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)等。

3、不可逆加密

利用哈希算法使数据加密之后无法解密回原数据。 这样的哈希算法常用的有:SHA-256, SHA-1, MD2、MD4、MD5、HAVAL等。

Go语言对这三种加密算法的实现如下所示:

//import "crypto/sha256"
h := sha256.New()
io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.")
fmt.Printf("% x", h.Sum(nil))

//import "crypto/sha1"
h := sha1.New()
io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.")
fmt.Printf("% x", h.Sum(nil))

//import "crypto/md5"
h := md5.New()
io.WriteString(h, "需要加密的密码")
fmt.Printf("%x", h.Sum(nil))

加密解决方案

1. MD5加盐

对MD5加密的数据加入揉合进特定的随机数,再二次生成MD5。

在我们上面登录系统的示例代码中,$md5password = md5($password); 从这句代码可以看到采用了md5的不可逆加密算法来存储密码,这也是多年来业界常用的密码加密算法,但是这仍然不安全。为什么呢?这是因为md5加密有一个特点:同样的字符串经过md5哈希计算之后生成的加密字符串也是相同的,由于业界采用这种加密的方式由来已久,黑客们也准备了自己强大的md5彩虹表来逆向匹配加密前的字符串,这种用于逆向反推MD5加密的彩虹表在互联网上随处可见,在Google里使用md5 解密作为关键词搜索,一下就能找到md5在线破解网站,把我们插入用户数据时候的MD5加密字符串e10adc3949ba59abbe56e057f20f883e填入进去,瞬间就能得到加密前的密码:123456。

当然也并不是每一个都能成功,但可以肯定的是,这个彩虹表会越来越完善。所以,我们有迫切的需求采用更好的方法对密码数据进行不可逆加密,通常的做法是为每个用户确定不同的密码加盐(salt)后,再混合用户的真实密码进行md5加密,如以下代码:

//用户注册时候设置的password
$password = $_POST['password'];
//md5加密,传统做法直接将加密后的字符串存入数据库,但这不够,我们继续改良
$passwordmd5 = md5($password);
//为用户生成不同的密码盐,算法可以根据自己业务的需要而不同
$salt = substr(uniqid(rand()), -6);
//新的加密字符串包含了密码盐
$passwordmd5 = md5($passwordmd5.$salt);

2. 外部方案Scrypt

scrypt方案,scrypt是由著名的FreeBSD黑客Colin Percival为他的备份服务Tarsnap开发。Scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。

目前Go语言里面支持的库http://code.google.com/p/go/source/browse?repo=crypto#hg%2Fscrypt

dk := scrypt.Key([]byte(“some password”), []byte(salt), 16384, 8, 1, 32) 通过上面的的方法可以获取唯一的相应的密码值,这是目前为止最难破解的。

参考资料:

链接:https://www.zhihu.com/question/22953267/answer/80141632 作者:潘良虎
链接:http://www.kancloud.cn/kancloud/web-application-with-golang/44198 作者:Asta谢

文章目录