有没有办法使用 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
变量包含散列密码,因此我可以将散列值与此进行比较。
通过 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
变量包含散列密码,因此我可以将散列值与此进行比较。