2013-08-31 13 views
10

Zazwyczaj używałem biblioteki bcrypt do tworzenia hashowania hasłem, ale nie jestem w stanie tego zrobić z powodu korzystania z biblioteki syscall. Próbowałem również scrypt. Jakie inne sposoby są bezpieczne i jaki byłby najlepszy sposób?Golang/App Engine - bezpieczna haszowanie hasła użytkownika

+0

O ile jestem w stanie powiedzieć, bibliotekę scrypt na http://code.google.com/p/go/source/browse/scrypt/scrypt.go?repo=crypto robi” t użyj 'syscall'. – Intermernet

+0

Hmm. Próbowałem, i mam ten sam błąd. Myślę, że lib pbkdf2 go używa - jeśli spróbuję, to też umiera. – benkraus

Odpowiedz

14

Spójrz na go.crypto. Oferuje wsparcie dla pbkdf2 i bcrypt. Obie implementacje są napisane wyłącznie w Go i powinny działać na GAE dobrze.

Najprostszym w użyciu jest prawdopodobnie bcrypt. Aby uzyskać przebieg pakiet:

go get golang.org/x/crypto/bcrypt 

Przykład użycia:

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

Wyjście będzie coś takiego:

$2a$10$sylGijT5CIJZ9ViJsxZOS.IB2tOtJ40hf82eFbTwq87iVAOb5GL8e 

Jeśli chcesz po prostu skrótu, należy użyć PBKDF2. Przykład:

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

dlaczego "odroczyć wyczyść (hasło)" konieczne? –

+1

@HelinWang To nie jest tak, ale lubię nadpisywać pamięć, w której przechowywano hasło w postaci zwykłego tekstu. – nemo

+0

dziękuję, to interesujący punkt. –

Powiązane problemy