【问题标题】:Generating crypt() sha512 hashes in Go在 Go 中生成 crypt() sha512 哈希
【发布时间】:2014-11-29 18:15:54
【问题描述】:

我正在使用 GoLang 开发我的授权模块。在我们使用 PHP5 和 crypt 函数之前。哈希是像 SHA-512 一样生成的:

$6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

并像这样存储在数据库中。但现在我需要让它在 GoLang 中也能工作。我在 Google 上搜索并尝试了不同的方法,例如:

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

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

我们想要像 php 版本一样验证和创建哈希。

提前致谢。

【问题讨论】:

  • PHP 版本看起来如何?在此处发布的 go 示例中,您散列了您所追求的结果字符串的开头。您应该(可能)散列盐+密码,然后附加 $6$rounds$salt$。您还需要引入一个循环来实际使用轮数。
  • 如果不需要与现有哈希兼容,不要使用 SHA-512,使用 Go 的 bcrypt 库 (godoc.org/code.google.com/p/go.crypto/bcrypt)。 SHA-512 距离成为合适的密码散列函数还有很长的路要走。
  • 目前我们坚持使用 SHA-512 散列函数。在我们拥有 md5 之前,但我们在运行时将其更改为 SHA-512。每次用户登录时,在我们的系统中,系统都会检查 sha-512 哈希是否存在。如果不是,请使用 md5 哈希进行验证。如果 md5 散列正确,则使用 SHA-512 散列加密并删除 md5 散列。这样我们也可以去更好的功能。

标签: php go crypt sha512


【解决方案1】:

https://github.com/kless/osutilosutil 库支持所有 crypt() 哈希类型。

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

echo crypt('rasmuslerdorf', '$6$usesomesillystringforsalt');

此代码产生以下哈希:

$6$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

这可以像这样在 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)
}

运行时,它也会产生正确的哈希:

$6$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

我希望这能回答你的问题。

在实现这一点时请注意,盐只使用了 16 个字符,因此盐usesomesillystri 会返回相同的哈希值。确保在生产代码中选择随机盐。

【讨论】:

  • 非常感谢!这正是我要寻找的地方。它适用于我当前的密码哈希。
  • rounds=5000 怎么样?
  • 有谁知道为什么c.Generate([]byte("enter-new-password"), []byte("$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2")) 给我一个invalid magic prefix 错误?
  • 我已经通过这个问题回答了我自己的评论:stackoverflow.com/questions/51119682/…。 kless/osutil 不支持河豚哈希方法,所以我不得不一起使用不同的模块。河豚常用于PHP5.3及以下。
  • 添加我尝试过的一件事:如果您不想像上面建议的那样编写随机化盐,您只需要在以下行中传递空字符串,即 salt := ""。这个工具本身在 c.Generate([]byte(plainText), []byte(salt)) 中生成随机盐/前缀 ($6$)
猜你喜欢
  • 2020-02-08
  • 1970-01-01
  • 2018-12-03
  • 2019-05-08
  • 1970-01-01
  • 2012-11-14
  • 2019-11-28
  • 1970-01-01
相关资源
最近更新 更多