go - 有没有办法使用 bcrypt 算法版本 6?
问题描述
使用crypt()
C 程序中的函数,我得到了密码“toto”的以下哈希:
$6$QSX8hjVa$Oj9IAu50jSsAAm62MOo63Ea4p1o8DC0zcR6I8N5f4jRgE0Bv0WRFEJwO4hGxAAMyOF2ON5Dwze2InWV9nDWVm1
但是,使用以下代码时,出现错误:
package main
import (
"fmt"
"os"
"golang.org/x/crypto/bcrypt"
)
func main() {
hashToCrack := "$6$QSX8hjVa$Oj9IAu50jSsAAm62MOo63Ea4p1o8DC0zcR6I8N5f4jRgE0Bv0WRFEJwO4hGxAAMyOF2ON5Dwze2InWV9nDWVm1"
fmt.Println(bcrypt.CompareHashAndPassword([]byte(hashToCrack), []byte("toto")))
}
$ go run main.go
crypto/bcrypt: bcrypt algorithm version '6' requested is newer than current version '2'
在我的项目中使用带有 $6$ ID 的 bcrypt 是必要的(评论中有更多详细信息),但该bcrypt
软件包似乎不支持此版本。有没有其他方法或者我滥用了这个包?
解决方案
使用该软件包github.com/tredoe/osutil/user/crypt/sha512_crypt
解决了我的问题。
$ go get github.com/tredoe/osutil/user/crypt/sha512_crypt
package main
import (
"fmt"
"strings"
"github.com/tredoe/osutil/user/crypt/sha512_crypt"
)
func main() {
hashToCrack := "$6$QSX8hjVa$Oj9IAu50jSsAAm62MOo63Ea4p1o8DC0zcR6I8N5f4jRgE0Bv0WRFEJwO4hGxAAMyOF2ON5Dwze2InWV9nDWVm1"
c := sha512_crypt.New()
hash, err := c.Generate([]byte("toto"), []byte("$6$QSX8hjVa$"))
if err != nil {
panic(err)
}
fmt.Println(strings.Compare(hashToCrack, hash)) // prints 0 because they are the sames
}
$ go run main.go
0
正如 Steffen Ullrich 在评论中提到的那样,$6$
不是 bcrypt 而是 sha512crypt,正如我们在 crypt 手册页中看到的那样。
该hash
变量包含哈希密码,因此我可以将哈希值与此进行比较。
推荐阅读
- html - 移除 HTML 元素的蓝色轮廓
- jquery - 客户端可以从 $.get() jQuery 调用中获取 URL 吗?
- python - 传递单击的按钮以在 Tkinter 中运行
- xml - 在 XSLT 中显示 URL
- sql - 计算往返通勤中停靠站之间的时间
- react-native - 如何根据状态更新反应导航 5 headerRight 中的文本?
- java - Spring Data JPA - javax.persistence.TransactionRequiredException:执行更新/删除查询
- python - Django-admin 自定义命令不存储缓存值
- mysql - 由于外键无法创建表
- google-apps-script - 如何在 Google 表格中复制粘贴带有超链接文本的单元格?