Какой bcrypt стоит использовать для 2018 года? - PullRequest
0 голосов
/ 22 мая 2018

Обновление

На самом деле, похоже, что эталонный тест был неправильно настроен. Я проследил за ресурсом , к которому предоставлен общий доступ пользователем @Luke Joshua Park, и теперь он работает.

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

Старый неверный тест

У меня есть небольшой набор тестов для тестирования в Голанге, и мне интересно, какую рекомендованную стоимость bcrypt использовать с мая 2018 года.

Это мой файл бенчмарка:

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() func внутри 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

Похоже, что для bcrypt со стоимостью 13 требуется время 0,32 наносекунды, а для стоимости 14 - 1281338532 нс или ~ 1,2 секунды, что я считаю слишком большим.Что такое лучшая стоимость bcrypt для использования в текущем 2018 году?

1 Ответ

0 голосов
/ 22 мая 2018

Я не уверен, что здесь происходит с 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 составляет 154 мс, а 12 - 334 мс.Таким образом, мы наблюдаем примерно удвоение, как и ожидалось.

Цель не является фактором работы;это времяВы хотите до тех пор, как вы можете жить с.По моему опыту (в основном работающем над клиентскими приложениями), 80-100 мс - хорошая цель, потому что по сравнению с сетевым запросом он необнаружим для пользователя, но при этом является массовым с точки зрения атак методом перебора (поэтому значение по умолчанию 10 идеально подходит для моегообщего пользования).

Обычно я избегаю растягивания пароля на серверах, если могу помочь, но такой масштаб может быть разумным компромиссом между влиянием сервера и безопасностью.Помните, что злоумышленники могут использовать что-то значительно быстрее, чем MacBook Pro, и могут использовать несколько компьютеров параллельно;Я выбираю 80-100 мс из-за компромиссов пользовательского опыта.(Я выполняю растягивание пароля на клиенте, когда мне это удается, и затем применяю дешевый хеш, такой как SHA-256, на сервере.)

Но если вы делаете это не очень часто, или можететратить больше времени на это, потом, конечно, лучше, и на моем MacBook Pro коэффициент работы 14 составляет около 1,2 с, что я бы, конечно, принял для некоторых целей.

Но есть причина, по которой 10по-прежнему по умолчанию.Это не необоснованное значение.

...