用户密码的Golang Base64编码SHA256摘要

4

我希望通过参加 Top Code Go Learning Challenges 学习 Go 编程。我目前正在解决他们的 Simple API Web Server problem。该问题的一部分要求您按照以下方式对密码字符串进行加密:"‘{SHA256}’ + 用户密码的 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
感谢指针,我只是按照提供的测试数据编程以匹配规范。提供的设计还将密码明文存储在JSON文件中。 - MrWizard54
3
是的,我已经联系过他们,希望他们能使用更合适的结构。从长远来看,这会让新手失败,因为像这样的课程显得“权威”。 - elithrar
1个回答

12

您正在误用Sum方法。 hash.Hash接口的文档明确说明:

Sum将当前哈希附加到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
顺便提一下,你的第一个例子也可以使用 b := h.Sum(nil) - alecbz
这很棒。只有一个问题,结果已经在摘要中了吗? - Louie Miranda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接