2013-08-31 27 views
10

Tôi thường sử dụng thư viện bcrypt để băm mật khẩu, nhưng không thể làm như vậy do sử dụng thư viện syscall. Tôi cũng đã thử scrypt. Những cách khác là an toàn, và đó sẽ là cách tốt nhất?Golang/App Engine - bẻ khóa an toàn mật khẩu của người dùng

+0

Theo như tôi có thể nói thư viện mã hóa tại http://code.google.com/p/go/source/browse/scrypt/scrypt.go?repo=crypto doesn ' t sử dụng 'syscall'. – Intermernet

+0

Hmm. Tôi đã thử nó, và tôi nhận được cùng một lỗi. Tôi nghĩ rằng pbkdf2 lib đang sử dụng nó - Nếu tôi thử điều đó, nó cũng chết. – benkraus

Trả lời

14

Hãy xem go.crypto. Nó cung cấp hỗ trợ cho pbkdf2 và bcrypt. Cả hai cách triển khai hoàn toàn được viết bằng Go và sẽ hoạt động tốt trên GAE.

Cách đơn giản nhất để sử dụng có lẽ là bcrypt. Để có được gói chạy:

go get golang.org/x/crypto/bcrypt 

Ví dụ sử dụng:

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

Đầu ra sẽ là một cái gì đó như thế này:

$2a$10$sylGijT5CIJZ9ViJsxZOS.IB2tOtJ40hf82eFbTwq87iVAOb5GL8e 

Nếu bạn muốn chỉ đơn giản là băm, sử dụng pbkdf2. Ví dụ:

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

tại sao 'trì hoãn rõ ràng (mật khẩu) 'cần thiết? –

+1

@HelinWang Nó không phải nhưng tôi muốn ghi đè lên bộ nhớ mà mật khẩu văn bản thuần túy được giữ. – nemo

+0

cảm ơn, đó là một điểm thú vị. –

Các vấn đề liên quan