登录
首页 >  Golang >  Go问答

golang 相当于 PHP crypt()

来源:Golang技术栈

时间:2023-04-05 20:14:16 113浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《golang 相当于 PHP crypt()》,文章讲解的知识点主要包括golang,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

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"))

尝试 2

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

package main

import (
    "fmt"
    "unsafe"
)

// #cgo LDFLAGS: -lcrypt
// #define _GNU_SOURCE
// #include 
// #include 
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 和更早版本使用的:

[为什么我的 crypt 包给我无效的魔法前缀错误?](https://stackoverflow.com/questions/51123718/why- do-golang-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 中的模块不支持河豚。

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《golang 相当于 PHP crypt()》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>