相当于PHP crypt()的golang

时间:2018-07-01 01:09:48

标签: php go crypt

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

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

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

尝试1

我尝试过,但是评估为假:

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

ATTEMPT 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
}

ATTEMPT 3

我也尝试过此方法,但是它似乎不支持CRYPT_BLOWFISH,这是较早的PHP5.3和更早版本使用的:

Why does my crypt package give me invalid magic prefix error?

所以我的问题是:

对于字符串enter-new-password$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2,如何使golang crypt函数的行为与PHP crypt函数的行为完全相同?

1 个答案:

答案 0 :(得分:4)

尽管我还没有找到与PHP的crypt函数完全相同的“转到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中的模块不支持河豚。