Golang Может кто-нибудь объяснить, почему сравнение хэшей не удалось - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь разработать систему входа пользователя, для этого я тестирую функцию bcrypt в golang.Но я столкнулся с некоторой забавной ситуацией.

Мой учебный материал bcrypt взят из этого, код хорошо работает https://medium.com/@jcox250/password-hash-salt-using-golang-b041dc94cb72

Но когда я писал свой собственный код, он по-прежнему терпел неудачу в сравнении.

package main

import (
    "log"

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

func main() {
    hash1, _ := bcrypt.GenerateFromPassword([]byte("123456"), bcrypt.MinCost)
    hash2, _ := bcrypt.GenerateFromPassword([]byte("123456"), bcrypt.MinCost)

    err := bcrypt.CompareHashAndPassword(hash1, hash2)

    if err != nil {
        log.Println(err)
    } else {
        log.Println("success")
    }
}

Поскольку строка для хеширования - это та же самая "123456", я, кроме вывода моего кода, должен быть success, но результат будет crypto/bcrypt: hashedPassword is not the hash of the given password.

Может кто-нибудь объяснитьэто и направь меня.

1 Ответ

2 голосов
/ 02 мая 2019

В документации по используемой функции говорится, что она сравнивает хеш с открытым текстом, а не с хешем:

CompareHashAndPassword сравнивает хешированный bcrypt-пароль с его возможным эквивалентом в виде открытого текста.Возвращает ноль в случае успеха или ошибку при ошибке.

Если бы вы печатали или сравнивали каждый из сгенерированных хэшей, они также не совпадали бы точно (в этом вся суть).Но вы должны быть в состоянии использовать функцию CompareHashAndPassword, чтобы проверить, использовался ли пароль для генерации данного хэша.

Попробуйте это:

err := bcrypt.CompareHashAndPassword(hash1, []byte("123456"))
if err != nil {
    log.Println(err)
} else {
    log.Println("success")
}
...