一尘不染

Golang / App Engine-安全地哈希用户密码

go

我通常使用bcrypt库进行密码哈希处理,但由于该库使用,因此无法这样做syscall。我也尝试过scrypt。还有哪些其他方法是安全的,哪一种是最佳方法?


阅读 256

收藏
2020-07-02

共1个答案

一尘不染

看看go.crypto。它提供对pbkdf2和bcrypt的支持。两种实现都是用Go编写的,并且可以在GAE上正常工作。

最简单的使用方法可能是bcrypt。要运行包:

go get golang.org/x/crypto/bcrypt

用法示例:

import "golang.org/x/crypto/bcrypt"

func clear(b []byte) {
    for i := 0; i < len(b); i++ {
        b[i] = 0;
    }
}

func Crypt(password []byte) ([]byte, error) {
    defer clear(password)
    return bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
}

ctext, err := Crypt(pass)

if err != nil {
    log.Fatal(err)
}

fmt.Println(string(ctext))

输出将是这样的:

$2a$10$sylGijT5CIJZ9ViJsxZOS.IB2tOtJ40hf82eFbTwq87iVAOb5GL8e

如果只需要哈希,请使用pbkdf2。例:

import "golang.org/x/crypto/pbkdf2"

func HashPassword(password, salt []byte) []byte {
    defer clear(password)
    return pbkdf2.Key(password, salt, 4096, sha256.Size, sha256.New)
}

pass := []byte("foo")
salt := []byte("bar")

fmt.Printf("%x\n", HashPassword(pass, salt))
2020-07-02