2018 年使用哪种 bcrypt 成本?
Which bcrypt cost to use for 2018?
更新
实际上,基准测试似乎设置不正确我已经按照用户@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)
}
这是 HashPassword()
里面的函数 main.go
:
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 成本。
我不确定这里的 Benchmark 是怎么回事。如果你只是计时这些,它工作得很好,你可以为你计算出正确的答案。
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 的工作因数,在我的 MacBook Pro 上我得到 78 毫秒。工作因数 11 是 154ms,12 是 334ms。因此,正如预期的那样,我们看到大约翻了一番。
目标不是工作因素;是时候了。你想活多久就活多久。根据我的经验(主要是在客户端应用程序上工作),80-100 毫秒是一个不错的目标,因为与网络请求相比,用户无法检测到它,同时在暴力攻击方面是巨大的(因此默认值 10 是我的理想选择共同使用)。
如果可以的话,我通常会避免 运行 服务器上的密码扩展,但这种规模可以是服务器影响和安全性之间的合理权衡。请记住,攻击者可能会使用比 MacBook Pro 快得多的东西,并且可能同时使用多台机器;由于用户体验权衡,我选择 80-100 毫秒。 (当我可以逃脱时,我在客户端执行密码扩展,然后在服务器上应用像 SHA-256 这样的廉价散列。)
但如果你不经常这样做,或者可以花更多时间在上面,那么时间越长当然越好,在我的MacBook Pro上14的工作因数大约是1.2s,我当然会这样出于某些目的接受。
但是 10 仍然是默认值是有原因的。这不是一个不合理的值。
更新
实际上,基准测试似乎设置不正确我已经按照用户@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)
}
这是 HashPassword()
里面的函数 main.go
:
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 成本。
我不确定这里的 Benchmark 是怎么回事。如果你只是计时这些,它工作得很好,你可以为你计算出正确的答案。
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 的工作因数,在我的 MacBook Pro 上我得到 78 毫秒。工作因数 11 是 154ms,12 是 334ms。因此,正如预期的那样,我们看到大约翻了一番。
目标不是工作因素;是时候了。你想活多久就活多久。根据我的经验(主要是在客户端应用程序上工作),80-100 毫秒是一个不错的目标,因为与网络请求相比,用户无法检测到它,同时在暴力攻击方面是巨大的(因此默认值 10 是我的理想选择共同使用)。
如果可以的话,我通常会避免 运行 服务器上的密码扩展,但这种规模可以是服务器影响和安全性之间的合理权衡。请记住,攻击者可能会使用比 MacBook Pro 快得多的东西,并且可能同时使用多台机器;由于用户体验权衡,我选择 80-100 毫秒。 (当我可以逃脱时,我在客户端执行密码扩展,然后在服务器上应用像 SHA-256 这样的廉价散列。)
但如果你不经常这样做,或者可以花更多时间在上面,那么时间越长当然越好,在我的MacBook Pro上14的工作因数大约是1.2s,我当然会这样出于某些目的接受。
但是 10 仍然是默认值是有原因的。这不是一个不合理的值。