Golang / App Engine-безопасное хеширование пароля пользователя


Обычно я использую библиотеку bcrypt для хэширования паролей, но не могу этого сделать из-за использования библиотекой syscall. Я также пробовал scrypt. Какие еще пути безопасны,и какой из них будет лучшим?

1 10

1 ответ:

Взгляните на go.крипто . Он предлагает поддержку 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))