Почему хеширование так медленно? - PullRequest
0 голосов
/ 25 марта 2020

Я работаю над веб-приложением. Для того, чтобы иметь sh пароли, я использовал следующие логики c

package core

import (
    "math/rand"

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

type User struct {
    Username string `json:"username"`
    Password string `json:"password"`
}

type Hasher interface {
    HashPassword()
}

func (u *User) HashPassword() {
    cost := rand.Intn(28) + 4

    //TODO: Handle error
    hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(u.Password), cost)
    u.Password = string(hashedPassword)
}

Затем при обработке запросов

func HandleRegister(w http.ResponseWriter, r *http.Request) {
    var user core.User
    var hasher core.Hasher
    hasher = &user

    //TODO: Handle error
    _ = json.NewDecoder(r.Body).Decode(&user)

    hasher.HashPassword()

    fmt.Println(user)
}

Я использую случайные затраты для хеширования в целях безопасности. Проблема в том, что, когда стоимость стала большой, процесс действительно замедлился. Я использую Postman для отправки запроса на мой сервер, но это очень медленно. Почему это так? Моя реализация неверна?

Примечание: В моей базе данных SQLite я выбираю тип TEXT для столбца пароля для хранения хешированного пароля. Было бы лучше использовать тип BLOB вместо TEXT?

1 Ответ

6 голосов
/ 25 марта 2020

Ваша максимальная стоимость составляет 32. Это означает 2 ^ 32 раунда расширения ключа. Даже простой l oop, который просто перебирает каждое число от 1 до 2 ^ 32, ничего не делая, занял бы несколько секунд. Вы должны ограничить свою стоимость более разумным числом.

Кроме того, ваша минимальная стоимость 4 слишком мала. Это всего 16 раундов. Это сделает взлом пароля проще, чем должен быть.

Почему вы даже используете случайное число? Прочтите это для лучшего выбора стоимости.

...