2013-08-31 17 views
10

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

+0

syscall işlevini kullanmayın. – Intermernet

+0

Hmm. Denedim ve aynı hatayı alıyorum. Bence pbkdf2 lib kullanıyor - Eğer bunu denerseniz, o da ölür. – benkraus

cevap

14

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)) 
+0

neden açık (parola) gerekli? –

+1

@HelinWang Bu, ancak düz metin parolasının tutulduğu belleğin üzerine yazmaktan hoşlanırım. – nemo

+0

teşekkürler, bu ilginç bir nokta. –

İlgili konular