【发布时间】: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 散列。这样我们也可以去更好的功能。