2013-08-31 12 views
10

私は通常、パスワードのハッシュを行うのにbcryptライブラリを使用しましたが、ライブラリの使用によりsyscallが使用できなかったのです。私もscryptを試みました。どのような他の方法が安全で、どちらが最善の方法でしょうか?Golang/App Engine - ユーザーのパスワードを安全にハッシュする

+0

私がhttp://code.google.com/p/go/source/browse/scrypt/scrypt.go?repo=cryptoにあるscryptライブラリに伝えることができる限り、 'syscall'を使ってください。 – Intermernet

+0

Hmm。私はそれを試して、私は同じエラーが発生します。私はpbkdf2ライブラリがそれを使用していると思う - 私はそれを試しても、それも死ぬ。 – benkraus

答えて

14

go.cryptoをご覧ください。 pbkdf2とbcryptをサポートしています。 どちらの実装も純粋にGoで書かれており、GAEでうまく動作するはずです。

最も簡単に使用するのはおそらくbcryptです。

go get golang.org/x/crypto/bcrypt 

使用例:: は、パッケージの実行を取得するには、単にハッシュをしたい場合は、

$2a$10$sylGijT5CIJZ9ViJsxZOS.IB2tOtJ40hf82eFbTwq87iVAOb5GL8e 

PBKDF2を使用します。

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

を出力は次のようなものになります。例:

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

なぜ 'defer clear(password)'が必要ですか? –

+1

@HelinWangプレーンテキストのパスワードが保存されていた場所のメモリを上書きするのが好きです。 – nemo

+0

ありがとう、それは興味深い点です。 –

関連する問題