加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang相当于PHP crypt()

发布时间:2020-12-16 19:04:41 所属栏目:大数据 来源:网络整理
导读:PHP中的这行代码求值为true echo '$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2' == crypt("enter-new-password",'$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2'); 我需要的是Golang中的crypt函数,它也将评估为true. AT
PHP中的这行代码求值为true
echo '$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2' == crypt("enter-new-password",'$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2');

我需要的是Golang中的crypt函数,它也将评估为true.

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

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
}

尝试3

我也试过这个,但它似乎没有支持CRYPT_BLOWFISH,这是旧的PHP5.3及更早版本所使用的:

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

所以我的问题是:

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

虽然我没有找到与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中的模块不支持河豚.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读