Go Web编程那么我们作为一个Web应用开发者,在选择密码存储方案时, 容易掉入哪些陷阱, 以及如何避免这些陷阱? 普通方案 普通方案 目前用的最多的密码存储方案是将明文密码做单向哈希后存储,单向哈希算法有一个特征:无法通过哈希后的摘要 (digest)恢复原始数据,这也是“单向”二字的来源。常用的单向哈希算法包括SHA-256, SHA-1, MD5等。 Go语言对这三种加密算法的实现如下所示: //import "crypto/sha256" 单向哈希有两个特性: 1)同一个密码进行单向哈希,得到的总是唯一确定的摘要。 2)计算速度快。随着技术进步,一秒钟能够完成数十亿次单向哈希计算。 结合上面两个特点,考虑到多数人所使用的密码为常见的组合,攻击者可以将所有密码的常见组合进行单向哈希,得 到一个摘要组合, 然后与数据库中的摘要进行比对即可获得对应的密码。这个摘要组合也被称为rainbow table。 因此通过单向加密之后存储的 有破译不了的密码,所以方案是:故意增加密码计算所需耗费的资源 和时间,使得任何人都不可获得足够的资源建立所需的rainbow table。 这类方案有一个特点,算法中都有个因子,用于指明计算密码摘要所需要的资源和时间,也就是计算强度。计算强度 越大,攻击者建立rainbow table越困难,以至于不可继续。 这里推荐scrypt方案,scrypt是由著名的FreeBSD黑客Colin P0 码力 | 295 页 | 5.91 MB | 1 年前3
共 1 条
- 1













