有没有办法使用 bcrypt 算法版本 6?

Is there a way to use bcrypt algorithm version 6?

通过 C 程序中的 crypt() 函数,我得到了密码“toto”的以下哈希值: $QSX8hjVa$Oj9IAu50jSsAAm62MOo63Ea4p1o8DC0zcR6I8N5f4jRgE0Bv0WRFEJwO4hGxAAMyOF2ON5Dwze2InWV9nDWVm1

但是,在使用下面的代码时,出现了错误:

package main

import (
    "fmt"
    "os"

    "golang.org/x/crypto/bcrypt"
)

func main() {
    hashToCrack := "$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'

在我的项目中需要使用 ID 为 $6$ 的 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 := "$QSX8hjVa$Oj9IAu50jSsAAm62MOo63Ea4p1o8DC0zcR6I8N5f4jRgE0Bv0WRFEJwO4hGxAAMyOF2ON5Dwze2InWV9nDWVm1"
    c := sha512_crypt.New()
    hash, err := c.Generate([]byte("toto"), []byte("$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 在评论中提到的那样,$ 不是 bcrypt 而是 sha512crypt,正如我们在 crypt 手册页中看到的那样。

hash 变量包含散列密码,因此我可以将散列值与此进行比较。