2014-10-05 108 views
0

我正在GoLang中使用我的授权模块。在我们使用PHP5的crypt函数之前。散列生成像SHA-512:在Go中生成crypt()sha512哈希

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

并存储在数据库中。但现在我需要在GoLang中使它工作。我在Google上搜索过并尝试过不同的东西,例如:

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

但是所有的东西都会生成不同的东西。谁可以进一步帮助我们?

我们想验证并创建像PHP版本的哈希。

在此先感谢。

+0

PHP版本的外观如何?在这里发布的示例中,您将哈希看起来像是您之后生成的字符串的开头。你应该(可能)对salt + password进行哈希处理,然后追加$ 6 $ rounds $ salt $。您还需要引入一个循环来实际使用轮回号码。 – JimL 2014-10-05 06:55:42

+0

如果不需要与现有哈希兼容,请不要使用SHA-512,请使用Go的bcrypt库(http://godoc.org/code.google.com/p/go.crypto/bcrypt)。 SHA-512作为一种合适的密码散列函数还有很长的路要走。 – elithrar 2014-10-06 03:04:55

+0

目前我们坚持SHA-512哈希函数。在我们使用md5之前,我们将其更改为SHA-512。每次用户登录系统时,系统都会检查sha-512哈希是否存在。如果不是,请用md5散列验证。如果md5散列正确,则使用SHA-512散列进行加密并除去md5散列。这样我们也可以去更好的功能。 – 2014-10-06 04:38:26

回答

4

osutilhttps://github.com/kless/osutil支持所有crypt()散列类型。

您的密码哈希值可以用下面的PHP代码生成:

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

此代码产生以下散列:

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

这在围棋转载如下:

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返回相同的散列。确保您在生产代码中选择随机盐。

+1

非常感谢!这正是我正在寻找的地方。它适用于我当前的密码哈希。 – 2014-10-05 20:52:11

+0

'rounds = 5000'怎么样? – 2017-09-13 06:10:12