2015-06-20 55 views
2

我正在嘗試完成頂級代碼去學習挑戰作爲學習去的車輛。我目前正在致力於他們的Simple API Web Server problem。該問題的一部分要求您加密密碼字符串,如「{SHA256}」+ Base64編碼的SHA256摘要的用戶密碼「Golang Base64編碼的用戶密碼SHA256摘要

我已經使用下面的代碼來做到這一點,不符合提供的測試用例。

import (
    "encoding/base64" 
    "crypto/sha256" 
) 

func encrtyptPasswords(password string) string { 
    h := sha256.New() 
    return "{SHA256}" + 
     string(base64.StdEncoding.EncodeToString(h.Sum([]byte(password)))) 
} 

對於ABCD1234應該以加密的輸入:{} SHA256 6c7nGrky_ehjM40Ivk3p3-OeoEm9r7NCzmWexUULaa4 =

,但我得到{} SHA256 == YWJjZDEyMzTjsMRCmPwcFJr79MiZb7kkJ65B5GSbk0yklZkbeFK4VQ代替。我懷疑我使用的是加密庫錯誤,但我不確定我應該使用什麼,因爲這似乎是SHA256的標準庫加密方法。

+2

請注意,SHA256是一種非常不安全的散列方式(它是散列算法,而不是加密算法)的用戶密碼。您應該使用爲此設計的密鑰派生函數(KDF)。 bcrypt(https://godoc.org/golang.org/x/crypto/bcrypt)和scrypt(https://github.com/elithrar/simple-scrypt)是這裏的事實標準。 – elithrar

+0

感謝您的指針,真的只是編程規格,以配合提供的測試數據。提供的設計還將密碼以明文方式存儲在JSON文件中。 – MrWizard54

+3

是的,我已經聯繫他們希望他們會使用更合適的結構。它從長遠看建立了失敗的新手,因爲這樣的教訓被認爲是「權威的」。 – elithrar

回答

5

您正在濫用Sum方法。該docshash.Hash接口明確說

總和追加當前哈希b,並返回所產生的切片。

(着重號。)

您需要可以將數據寫入到哈希和使用h.Sum這樣

h.Write([]byte(password)) 
b := h.Sum(nil) 

或只使用sha256.Sum256

h := sha256.Sum256([]byte(password)) 

遊樂場: http://play.golang.org/p/oFBePRQzhN

+1

FWIW'b:= h.Sum(nil)'也適用於你的第一個例子。 – Alec

+0

@alecb謝謝,編輯。 –