golang 相当于 PHP crypt()
golang equivalent of PHP crypt()
PHP 中的这行代码计算结果为真
echo 'a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2' == crypt("enter-new-password",'a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2');
我需要的是 Golang 中的一个 crypt 函数,它的计算结果也将为真。
尝试 1
我试过了,但它被评估为错误:
import "github.com/nyarla/go-crypt"
log.Println("a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2" == crypt.Crypt("enter-new-password","a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2"))
尝试 2
我也尝试定义和使用我在别处找到的这个 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
}
尝试 3
我也试过这个,但它似乎不支持 CRYPT_BLOWFISH,这是旧的 PHP5.3 和更早版本所使用的:
所以我的问题是:
如何让 golang crypt 函数的行为与字符串 enter-new-password
和 a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2
的 PHP crypt 函数完全一样?
尽管我还没有找到 "Go crypt function" 与 PHP 的 crypt 函数完全相同的函数,但我找到了一个替代函数。
以下解决了我的问题
import "golang.org/x/crypto/bcrypt"
// check will be nil if the bcrypt version of "enter-new-password" is the same as the "a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2" . Otherwise check will be an error object
check := bcrypt.CompareHashAndPassword([]byte("a$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 模块,但你必须明确说明散列类型、成本等......在我的问题中,a$
作为散列值前缀的存在表明使用了一些河豚类型的散列。我之前的一些尝试没有考虑到这一点。事实上,尝试3中的模块不支持blowfish。
PHP 中的这行代码计算结果为真
echo 'a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2' == crypt("enter-new-password",'a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2');
我需要的是 Golang 中的一个 crypt 函数,它的计算结果也将为真。
尝试 1
我试过了,但它被评估为错误:
import "github.com/nyarla/go-crypt"
log.Println("a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2" == crypt.Crypt("enter-new-password","a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2"))
尝试 2
我也尝试定义和使用我在别处找到的这个 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
}
尝试 3
我也试过这个,但它似乎不支持 CRYPT_BLOWFISH,这是旧的 PHP5.3 和更早版本所使用的:
所以我的问题是:
如何让 golang crypt 函数的行为与字符串 enter-new-password
和 a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2
的 PHP crypt 函数完全一样?
尽管我还没有找到 "Go crypt function" 与 PHP 的 crypt 函数完全相同的函数,但我找到了一个替代函数。
以下解决了我的问题
import "golang.org/x/crypto/bcrypt"
// check will be nil if the bcrypt version of "enter-new-password" is the same as the "a$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2" . Otherwise check will be an error object
check := bcrypt.CompareHashAndPassword([]byte("a$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 模块,但你必须明确说明散列类型、成本等......在我的问题中,a$
作为散列值前缀的存在表明使用了一些河豚类型的散列。我之前的一些尝试没有考虑到这一点。事实上,尝试3中的模块不支持blowfish。