From 592540c6495d7e240605a085ecc2814524dd67d7 Mon Sep 17 00:00:00 2001 From: vCaesar Date: Sun, 18 Dec 2016 16:24:15 +0800 Subject: [PATCH] Add 0.9.5.md syntax highlighting --- zh/09.5.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/zh/09.5.md b/zh/09.5.md index 2ced04ee..fedf7145 100644 --- a/zh/09.5.md +++ b/zh/09.5.md @@ -7,6 +7,7 @@ 目前用的最多的密码存储方案是将明文密码做单向哈希后存储,单向哈希算法有一个特征:无法通过哈希后的摘要(digest)恢复原始数据,这也是“单向”二字的来源。常用的单向哈希算法包括SHA-256, SHA-1, MD5等。 Go语言对这三种加密算法的实现如下所示: +```Go //import "crypto/sha256" h := sha256.New() @@ -23,6 +24,7 @@ Go语言对这三种加密算法的实现如下所示: io.WriteString(h, "需要加密的密码") fmt.Printf("%x", h.Sum(nil)) +``` 单向哈希有两个特性: - 1)同一个密码进行单向哈希,得到的总是唯一确定的摘要。 @@ -40,6 +42,8 @@ Go语言对这三种加密算法的实现如下所示: 没有攻不破的盾,但也没有折不断的矛。现在安全性比较好的网站,都会用一种叫做“加盐”的方式来存储密码,也就是常说的 “salt”。他们通常的做法是,先将用户输入的密码进行一次MD5(或其它哈希算法)加密;将得到的 MD5 值前后加上一些只有管理员自己知道的随机串,再进行一次MD5加密。这个随机串中可以包括某些固定的串,也可以包括用户名(用来保证每个用户加密使用的密钥都不一样)。 +```Go + //import "crypto/md5" //假设用户名abc,密码123456 h := md5.New() @@ -60,6 +64,7 @@ Go语言对这三种加密算法的实现如下所示: last :=fmt.Sprintf("%x", h.Sum(nil)) +``` 在两个salt没有泄露的情况下,黑客如果拿到的是最后这个加密串,就几乎不可能推算出原始的密码是什么了。 ## 专家方案 @@ -72,9 +77,10 @@ Go语言对这三种加密算法的实现如下所示: 这里推荐`scrypt`方案,scrypt是由著名的FreeBSD黑客Colin Percival为他的备份服务Tarsnap开发的。 目前Go语言里面支持的库http://code.google.com/p/go/source/browse?repo=crypto#hg%2Fscrypt +```Go dk := scrypt.Key([]byte("some password"), []byte(salt), 16384, 8, 1, 32) - +``` 通过上面的的方法可以获取唯一的相应的密码值,这是目前为止最难破解的。 ## 总结