web-dev-qa-db-ja.com

2018年に使用するbcryptのコストはどれですか?

更新

実際、ベンチマークが正しく設定されていないようです。ユーザー@Luke Joshua Parkが resource shared を実行しましたが、現在は機能しています。

_package main

import "testing"

func benchmarkBcrypt(i int, b *testing.B){
    for n:= 0; n < b.N; n++ {
        HashPassword("my pass", i)
        }

}

func BenchmarkBcrypt9(b *testing.B){
    benchmarkBcrypt(9, b)
}

func BenchmarkBcrypt10(b *testing.B){
    benchmarkBcrypt(10, b)
}

func BenchmarkBcrypt11(b *testing.B){
    benchmarkBcrypt(11, b)
}

func BenchmarkBcrypt12(b *testing.B){
    benchmarkBcrypt(12, b)
}

func BenchmarkBcrypt13(b *testing.B){
    benchmarkBcrypt(13, b)
}

func BenchmarkBcrypt14(b *testing.B){
    benchmarkBcrypt(14, b)
}
_

出力:

_BenchmarkBcrypt9-4            30      39543095 ns/op
BenchmarkBcrypt10-4           20      79184657 ns/op
BenchmarkBcrypt11-4           10     158688315 ns/op
BenchmarkBcrypt12-4            5     316070133 ns/op
BenchmarkBcrypt13-4            2     631838101 ns/op
BenchmarkBcrypt14-4            1    1275047344 ns/op
PASS
ok      go-playground   10.670s
_

古い誤ったベンチマーク

私はgolangでのベンチマークテストの小さなセットを持っており、2018年5月の時点で使用するのに推奨されるbcryptコストを知りたいと思っています。

これは私のベンチマークファイルです:

_package main

import "testing"

func BenchmarkBcrypt10(b *testing.B){
    HashPassword("my pass", 10)
}

func BenchmarkBcrypt12(b *testing.B){
    HashPassword("my pass", 12)
}

func BenchmarkBcrypt13(b *testing.B){
    HashPassword("my pass", 13)
}


func BenchmarkBcrypt14(b *testing.B){
    HashPassword("my pass", 14)
}

func BenchmarkBcrypt15(b *testing.B){
    HashPassword("my pass", 15)
}
_

これは_main.go_内のHashPassword()funcです。

_import (
    "golang.org/x/crypto/bcrypt"
)

func HashPassword(password string, cost int) (string, error) {
    bytes, err := bcrypt.GenerateFromPassword([]byte(password), cost)
    return string(bytes), err
}
_

現在の出力は次のとおりです。

_go test -bench=.
BenchmarkBcrypt10-4     2000000000           0.04 ns/op
BenchmarkBcrypt12-4     2000000000           0.16 ns/op
BenchmarkBcrypt13-4     2000000000           0.32 ns/op
BenchmarkBcrypt14-4            1    1281338532 ns/op
BenchmarkBcrypt15-4            1    2558998327 ns/op
PASS
_

コストが13のbcryptの場合、かかる時間は0.32ナノ秒であり、コストが14の場合、時間は1281338532nsまたは約1.2秒であるように思われますが、これは多すぎると思います。 2018年に使用するのに最適なbcryptコストは何ですか?.

4
CommonSenseCode

ここでベンチマークがどうなっているのかわかりません。これらの時間を計るだけで、それはうまく機能し、あなたはあなたのために正しい答えを見つけることができます。

package main

import (
    "golang.org/x/crypto/bcrypt"
    "time"
)

func main() {
    cost := 10

    start := time.Now()
    bcrypt.GenerateFromPassword([]byte("password"), cost)
    end := time.Now()

    print(end.Sub(start) / time.Millisecond)
}

作業係数が10の場合、MacBookProでは78ミリ秒になります。 11の作業係数は154ms、12は334msです。そのため、予想どおり、約2倍になっています。

目標は作業要素ではありません。それは時間です。あなたが一緒に暮らすことができる限りあなたは望む。私の経験(主にクライアントアプリでの作業)では、ブルートフォース攻撃の点で大規模でありながら、ネットワークリクエストと比較してユーザーが検出できないため、80〜100ミリ秒が適切なターゲットです(したがって、デフォルトの10は私の一般的な使用)。

私は通常、サーバー上でパスワードストレッチを実行することを避けていますが、この規模はサーバーへの影響とセキュリティの間の合理的なトレードオフになる可能性があります。攻撃者はMacBookProよりも劇的に高速なものを使用し、複数のマシンを並行して使用する可能性があることに注意してください。ユーザーエクスペリエンスのトレードオフのため、80〜100ミリ秒を選択します。 (私はクライアントでパスワードストレッチを実行して、それを回避できるときに、サーバーにSHA-256のような安価なハッシュを適用します。)

しかし、これをあまり頻繁に行わない場合、またはそれに多くの時間を費やすことができる場合は、もちろん長い方が良いです。私のMacBook Proでは、14の作業係数は約1.2秒です。これは確かにいくつかの目的で受け入れます。

しかし、10がまだデフォルトである理由があります。それは不合理な値ではありません。

7
Rob Napier