Genellikle parola karmaşası yapmak için bcrypt kütüphanesini kullandım, ancak kütüphanenin syscall
kullanımı nedeniyle bunu yapamıyorum. Ben de şifrelemeyi denedim. Başka hangi yollar güvenli ve en iyi yol hangisidir?Golang/App Engine - Bir kullanıcının parolasını güvenli bir şekilde sağlama
cevap
go.crypto'a bir göz atın. Pbkdf2 ve bcrypt için destek sunuyor. Her iki uygulama da yalnızca Go'da yazılmıştır ve GAE üzerinde çalışmalıdır.
Kullanmak için en basit olanı muhtemelen bcrypt'dir.
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))
çıktısı şu şekilde olacaktır:
go get golang.org/x/crypto/bcrypt
Örnek kullanımını: paket koşmak almak için
sadece karma, kullanım PBKDF2 istiyorsanız$2a$10$sylGijT5CIJZ9ViJsxZOS.IB2tOtJ40hf82eFbTwq87iVAOb5GL8e
. Örnek: Bildiğim kadarıyla kokan http://code.google.com/p/go/source/browse/scrypt/scrypt.go?repo=crypto de scrypt kütüphanesini söylemek mümkün değilim gibi
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))
neden açık (parola) gerekli? –
@HelinWang Bu, ancak düz metin parolasının tutulduğu belleğin üzerine yazmaktan hoşlanırım. – nemo
teşekkürler, bu ilginç bir nokta. –
syscall işlevini kullanmayın. – Intermernet
Hmm. Denedim ve aynı hatayı alıyorum. Bence pbkdf2 lib kullanıyor - Eğer bunu denerseniz, o da ölür. – benkraus