2014-10-05 182 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