首页 > 解决方案 > 有没有办法使用 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软件包似乎不支持此版本。有没有其他方法或者我滥用了这个包?

标签: gohashbcrypt

解决方案


使用该软件包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变量包含哈希密码,因此我可以将哈希值与此进行比较。


推荐阅读