php - golang 相当于 PHP crypt()

标签 php go crypt

PHP 中的这行代码计算结果为真

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

我需要的是 Golang 中的一个 crypt 函数,它的计算结果也将为真。

尝试 1

我试过了,但它被评估为 false:

import "github.com/nyarla/go-crypt"
log.Println("$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2" == crypt.Crypt("enter-new-password","$2a$09$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 和更早版本使用的:

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

所以我的问题是:

如何让 golang crypt 函数的行为与字符串 enter-new-password 的 PHP crypt 函数完全一样?和 $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 - golang 相当于 PHP crypt(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51119682/

相关文章:

php - Codeigniter:使用 session 从另一个表获取用户数据

go - 如何定义返回函数的函数?

linux - 如何使用 python crypt 或 bcrypt 为 useradd 创建加密密码?

php - 在 PHP 中的 mysqli 准备语句中使用 REGEXP

php - 地穴错误 - 'MAC is invalid.'

api - 如何将原始数据传递给发布请求

Go fmt 为数学表达式生成格式不一致的结果

php - 为什么我不应该在 crypt() 函数的 salt 中使用第 23 个字符?

c - 如何在 Windows 中使用 crypt(3)?

php - 我应该使用 PDO 来清理我的 Sql 查询还是 "mysql_real_escape_string"就足够了?