在Go中生成crypt()sha512哈希

Mic*_*uis 0 php crypt go sha512

我在GoLang工作我的授权模块.在我们使用PHP5和crypt函数之前.哈希的生成方式与SHA-512相同:

$6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
Run Code Online (Sandbox Code Playgroud)

并存储在数据库中.但现在我需要让它在GoLang中运行.我在Google上搜索并尝试了不同的东西,例如:

t512 := sha512_crypt.Crypt("rasmuslerdorf", "$6$usesomesillystringforsalt$")
fmt.Printf("hash: %v\n", t512)
Run Code Online (Sandbox Code Playgroud)

但都会产生不同的东西.谁能进一步帮助我们?

我们想要验证并创建像php版本一样的哈希.

提前致谢.

fd0*_*fd0 8

https://github.com/kless/osutil上的osutil库支持所有哈希类型.crypt()

您的密码哈希可以使用以下php代码生成:

echo crypt('rasmuslerdorf', '$6$usesomesillystringforsalt');
Run Code Online (Sandbox Code Playgroud)

此代码生成以下哈希:

$6$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
Run Code Online (Sandbox Code Playgroud)

这可以在Go中重现:

package main                                                

import (
    "fmt"

    "github.com/kless/osutil/user/crypt/sha512_crypt"
)

func main() {
    c := sha512_crypt.New()
    hash, err := c.Generate([]byte("rasmuslerdorf"), []byte("$6$usesomesillystringforsalt"))
    if err != nil {
        panic(err)
    }

    fmt.Println(hash)
}
Run Code Online (Sandbox Code Playgroud)

运行时,它还会生成正确的哈希:

$6$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
Run Code Online (Sandbox Code Playgroud)

我希望这回答了你的问题.

执行此操作时请注意,salt中只使用了16个字符,因此为salt返回相同的哈希值usesomesillystri.确保在生产代码中选择随机盐.

  • 要添加我尝试过的一件事:如果您不想按照上面的建议编写随机盐,则您需要的只是在下一行中传递空字符串,即 salt := "" 。该实用程序本身在 c.Generate([]byte(plainText), []byte(salt)) 中生成随机盐/前缀 ($6$) (2认同)