【发布时间】:2015-09-06 12:07:32
【问题描述】:
我正在尝试完成 Top Code 围棋学习挑战,以此作为学习围棋的工具。我目前正在处理他们的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 的标准库方法。
【问题讨论】:
-
请注意,SHA256 是一种非常不安全的散列(它是散列算法,而不是加密算法)用户密码的方法。您应该使用为此目的设计的密钥派生函数 (KDF)。 bcrypt (godoc.org/golang.org/x/crypto/bcrypt) 和 scrypt (github.com/elithrar/simple-scrypt) 是这里事实上的标准。
-
感谢您的指点,实际上只是对此进行编程以匹配提供的测试数据。提供的设计还将密码明文存储在 JSON 文件中。
-
是的,我已经联系过他们,希望他们会使用更合适的构造。从长远来看,它会让新手失败,因为这样的课程被认为是“权威的”。
标签: hash go cryptography sha256