Golang/App Engine - 安全地散列用户密码

ben*_*aus 10 hash google-app-engine go

我通常使用bcrypt库来进行密码散列,但由于库的使用,我无法这样做syscall.我也试过scrypt.还有哪些其他安全方法,哪种方式最好?

nem*_*emo 14

看看go.crypto.它支持pbkdf2和bcrypt.这两个实现都是纯粹用Go编写的,应该可以在GAE上运行.

最简单的使用可能是bcrypt.要运行包:

go get golang.org/x/crypto/bcrypt
Run Code Online (Sandbox Code Playgroud)

用法示例:

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))
Run Code Online (Sandbox Code Playgroud)

输出将是这样的:

$2a$10$sylGijT5CIJZ9ViJsxZOS.IB2tOtJ40hf82eFbTwq87iVAOb5GL8e
Run Code Online (Sandbox Code Playgroud)

如果您只想要哈希,请使用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))
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考 - 此实施已经发生了变化.新文档:http://godoc.org/golang.org/x/crypto/bcrypt (3认同)
  • 一个很好的补充可能是Mercurial需要获得lib,在ubuntu上安装它,例如你需要做sudo apt-get install mercurial,它为我解决了它.但是,如果您使用的是其他系统,请查看此页面:http://mercurial.selenic.com/wiki/Download (2认同)