相当于PHP crypt()的golang

PHP中的这一行代码评估为true

echo '$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2' == crypt("enter-new-password",'$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2');

我需要的是Golang中的一个crypt函数,该函数也将评估为true。

我试过了,但评估为假:

import "github.com/nyarla/go-crypt"

log.Println("$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2" == crypt.Crypt("enter-new-password","$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2"))

我还尝试定义和使用在其他地方找到的这个crypt函数,但它也返回false:

package main

import (

"fmt"

"unsafe"

)

// #cgo LDFLAGS: -lcrypt

// #define _GNU_SOURCE

// #include <crypt.h>

// #include <stdlib.h>

import "C"

// crypt wraps C library crypt_r

func crypt(key, salt string) string {

data := C.struct_crypt_data{}

ckey := C.CString(key)

csalt := C.CString(salt)

out := C.GoString(C.crypt_r(ckey, csalt, &data))

C.free(unsafe.Pointer(ckey))

C.free(unsafe.Pointer(csalt))

return out

}

我如何获得一个golang地穴功能完全一样的琴弦的PHP crypt函数enter-new-

password$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2

回答:

尽管我还没有找到与PHP的crypt函数完全相同的“ Go crypt函数”,但我找到了另一种方法。

以下解决了我的问题

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

// check will be nil if the bcrypt version of "enter-new-password" is the same as the "$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2" . Otherwise check will be an error object

check := bcrypt.CompareHashAndPassword([]byte("$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2"),[]byte("enter-new-password"))

log.Println(check)

golang.org/x/crypto/bcrypt/bcrypt_test.go对如何使用这个模块一些有用的例子。


显然,PHP的crypt函数具有多种不同的散列值方式,例如sha256,sha512,blowfish等。似乎那里有很多go

lang模块,但是您必须明确说明散列类型,成本等。在我的问题中,$2a$作为哈希值前缀的存在表明使用了一些河豚类型的哈希。我以前的一些尝试没有考虑到这一点。实际上,尝试3中的模块不支持河豚。

以上是 相当于PHP crypt()的golang 的全部内容, 来源链接: utcz.com/qa/413570.html

回到顶部