【问题标题】:Golang Base64 encoded SHA256 digest of the user’s passwordGolang Base64 编码的 SHA256 用户密码摘要
【发布时间】: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


【解决方案1】:

您误用了Sum 方法。 hash.Hash 接口的docs 明确表示

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

【讨论】:

  • FWIW b := h.Sum(nil) 也适用于您的第一个示例。
  • 这很棒。只是有一个问题,结果是否已经在摘要中?
猜你喜欢
  • 1970-01-01
  • 2020-09-06
  • 2014-11-29
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2015-05-27
相关资源
最近更新 更多