上一期的文章《我们应该如何保护用户的密码》里我们介绍了bcrypt相较于MD5SHA-1...SHA-256等哈希算法更适合用于做密码的哈希,原因就是bcrypt算法哈希字符串的速度远远慢于上面列举的那些算法。这样即使整个用户密码库被用户盗用后想要通过彩虹表和暴力破解的方法猜测出用户的密码代价会非常高昂。今天的文章里就主要来看一下bcrypt哈希的组成部分以及在Go语言里如何使用bcrypt对密码字符串进行哈希。

bcrypt哈希字符串的组成

bcrypt哈希由多个部分组成。这些部分用于确定创建哈希的设置,从而可以在不需要任何其他信息的情况下对其进行验证。

上图是一个bcrypt哈希的示例图,其由四部分组成:

  • Prefix说明了使用的bcrypt的版本
  • Cost是进行哈希的次数-数字越大生成bcrypt的速度越慢,成本越大。同样也意味着如果密码库被盗,攻击者想通过暴力破解的方法猜测出用户密码的成本变得越昂贵。
  • Salt是添加到要进行哈希的字符串中的随机字符(21.25个字符),所以使用bcrypt时不需要我们在表里单独存储Salt
  • Hashed Text是明文字符串最终被bcrypt应用这些设置哈希后的哈希文本。

另外无论什么方法:每个密码加单独的盐进行哈希,使用bcrypt进行哈希等等,如果用户使用非常简单的密码例如password123456,还是能被猜测出来的,所以在用户设置密码时应该禁止他们输入简单的密码。

Go语言使用bcrypt

bcrypt的原理和实现都非常复杂,不过常用的编程语言都有实现bcrypt的包让我们直接使用,在Go语言里是通过golang.org/x/crypto/bcrypt包提供bcrypt相关功能给开发者使用的。

接下来我们在http_demo项目里演示一下使用bcrypt做密码哈希和验证的方法,首先我们需要安装一下bcrypt

$ go get golang.org/x/crypto/bcrypt

bcrypt包只提供了三个函数:

  • CompareHashAndPassword 用于比对bcrypt哈希字符串和提供的密码明文文本是否匹配。
  • GenerateFromPassword以给定的Cost返回密码的bcrypt哈希。如果给定的成本小于MinCost,则将成本设置为DefaultCost(10)。
  • Cost返回用于创建给定bcrypt哈希的哈希成本。将来密码系统为了应对更大的计算能力而增加哈希成本时,该功能可以用于确定哪些密码需要更新。

我们创建一个处理请求的Handler程序,演示bcrypt库三个函数的功能

// ./handler/password_hashing.go
package handlerimport ("fmt""golang.org/x/crypto/bcrypt""net/http"
)func HashPassword(password string) (string, error) {bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)return string(bytes), err
}func CheckPasswordHash(password, hash string) bool {err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))return err == nil
}func GetHashingCost(hashedPassword []byte) int {cost, _ := bcrypt.Cost(hashedPassword) // 为了简单忽略错误处理return cost
}func PassWordHashingHandler(w http.ResponseWriter, r *http.Request) {password := "secret"hash, _ := HashPassword(password) // 为了简单忽略错误处理fmt.Fprintln(w,"Password:", password)fmt.Fprintln(w, "Hash:    ", hash)match := CheckPasswordHash(password, hash)fmt.Fprintln(w,"Match:   ", match)cost := GetHashingCost([]byte(hash))fmt.Fprintln(w,"Cost:    ", cost)}

增加Handler程序的路由:

func RegisterRoutes(r *mux.Router) {...indexRouter := r.PathPrefix("/index").Subrouter()indexRouter.HandleFunc("/password_hashing", handler.PassWordHashingHandler)...
}

重启http_demo服务器后访问http://localhost:8000/index/password_hashing即可得到如下结果:

Password: secret
Hash:     $2a$14$Ael8nW7UF/En/iI7LGdyBuaIO8VREbL2CAShRN0EUQHqtmOHXh.XK
Match:    true
Cost:     14

本文源代码已经打包上传,公众号回复gohttp13即可获得下载链接。如果觉得我的文章有收获,请帮忙点"在看"分享给更多人。

Go Web编程--使用bcrpyt哈希用户密码相关推荐

  1. 怎么调用获取被创建的预制体_Go 语言 Web 编程系列—— 获取用户请求数据(上)...

    0.GET/POST 请求数据 在 PHP 中,可以直接通过全局变量 $_GET 和 $_POST 快速获取 GET/POST 请求数据,GET 请求数据主要是 URL 查询字符串中包含的参数,以前面 ...

  2. Java如何控制用户输入的长度,用Java Applet 进行Web编程时,如何限制输入域中可输入字符的长度!解决后马上给分!!!...

    用Java Applet 进行Web编程时,如何限制输入域中可输入字符的长度!解决后马上给分!!! | create a new class FixLengthDocument extends Pla ...

  3. set-cookie 和 cookie 的区别_Go Web 编程如何确保Cookie数据的安全传输

    什么是Cookie Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上.通常, ...

  4. Go Web 编程--如何确保Cookie数据的安全传输

    什么是Cookie Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上.通常, ...

  5. 《jQuery与JavaScript入门经典》——第 1 章 动态Web编程简介 1.1理解Web服务器浏览器范式...

    本节书摘来自异步社区<jQuery与JavaScript入门经典>一书中的第1章,第1.1节,作者:[美]Brad Dayley著,更多章节内容可以访问云栖社区"异步社区&quo ...

  6. 全部编程皆为Web编程

    原文作者:Jeff Atwood   原文链接:http://blog.codinghorror.com/all-programming-is-web-programming Michael Brau ...

  7. 所有编程皆为Web编程

    原文作者:Jeff Atwood   原文链接:http://blog.codinghorror.com/all-programming-is-web-programming Michael Brau ...

  8. 搞懂了这几点,你就学会了Web编程

    做了那么多年Web编程,仔细想想, 其实本质上就那点事儿, 你抓住了几个重点问题, 学起来一点都不难. 1.  理解浏览器/服务器结构 (B/S) B/S 是从 90年代的客户端/服务器端发展而来, ...

  9. 物联网网络编程和web编程

    本文是基于嵌入式物联网研发project师的视觉对网络编程和web编程进行阐述. 对于专注J2EE后端服务开发的同学来说,这篇文章可能略微简单.可是网络编程和web编程对于绝大部分嵌入式物联网proj ...

最新文章

  1. C#中数组、ArrayList和List三者的区别
  2. linux网络管理基本命令
  3. day18 15.自定义连接池
  4. C++线程同步之事件(生产者与消费者问题)
  5. activemq控制发送频率_发送activemq
  6. C++重载运算符的规则详解
  7. Android自定义ViewGroup、自定义属性及自定义View
  8. 温故知新----css布局
  9. 一文搞懂linux磁盘管理以及各场景扩容需求(实操)
  10. 计算机结构体系:系统CPI计算例题(1.5)
  11. 北理计算机专业如何,2019北理计算机学硕经验分享
  12. 视频文件顺时针旋转90度
  13. RAID 磁盘阵列与阵列卡
  14. 1217_使用SCons生成目标文件
  15. Matplotlib多子图绘图后保存单个子图
  16. 图形学(3)光栅图形学的直线绘制(下)
  17. python网络数据采集学习笔记(二)
  18. 老子道德经81章全文及解释
  19. 扶苏的bitset浅谈
  20. 每日软件分享:去图片水印免费软件有哪些?

热门文章

  1. Vue.set()实现数据动态响应
  2. Guava学习笔记:EventBus(转)
  3. systemd 开机无法启动privoxy
  4. 脚本修改域内本地管理员密码
  5. 让VirtualBox虚拟机实现开机自动后台运行
  6. 端口映射原理,公网,内网,NA
  7. 生活等级测试(娱乐性质)
  8. 2017 4月25日下午
  9. python 爬虫 scrapy1_官网教程
  10. 输出10000以内的第M到第N个素数(Eclipse gcc下)