Генерация хэшей crypt() sha512 в Go

Я работаю над своим модулем авторизации в GoLang. Раньше мы использовали PHP5 с функцией crypt. Хэш был сгенерирован как SHA-512:

$6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

И хранится так в базе данных. Но теперь мне нужно, чтобы это работало и в GoLang. Я искал в Google и пробовал разные вещи, например:

t512 := sha512_crypt.Crypt("rasmuslerdorf", "$6$usesomesillystringforsalt$")
fmt.Printf("hash: %v\n", t512)

Но все генерируют разные вещи. Кто может помочь нам дальше?

Мы хотим проверить и создать хэши, такие как версия php.

Заранее спасибо.


person Michael Tijhuis    schedule 05.10.2014    source источник
comment
Как выглядит версия PHP? В приведенном здесь примере go вы хешируете то, что выглядит как начало результирующей строки, которая вам нужна. Вы должны (вероятно) хэшировать соль + пароль, а затем добавлять $6$rounds$salt$. Вам также нужно будет ввести цикл, чтобы фактически использовать количество раундов.   -  person JimL    schedule 05.10.2014
comment
Если нет необходимости в совместимости с существующими хэшами, не используйте SHA-512, используйте библиотеку Go bcrypt (godoc.org/code.google.com/p/go.crypto/bcrypt). SHA-512 — это далеко не подходящая функция хеширования паролей.   -  person elithrar    schedule 06.10.2014
comment
На данный момент мы придерживаемся хэш-функции SHA-512. Раньше у нас был md5, но мы на лету поменяли его на SHA-512. Каждый раз, когда пользователь входил в систему, в нашей системе система проверяла, существует ли хэш sha-512. Если нет, проверьте с помощью хэша md5. Если хэш md5 правильный, зашифруйте его с помощью хэша SHA-512 и удалите хэш md5. Таким образом, мы можем перейти и к лучшей функции.   -  person Michael Tijhuis    schedule 06.10.2014


Ответы (1)


Библиотека osutil по адресу https://github.com/kless/osutil поддерживает все типы хэшей crypt().

Ваш хэш пароля может быть создан с помощью следующего php-кода:

echo crypt('rasmuslerdorf', '$6$usesomesillystringforsalt');

Этот код создает следующий хэш:

$6$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

Это можно воспроизвести в Go следующим образом:

package main                                                

import (
    "fmt"

    "github.com/kless/osutil/user/crypt/sha512_crypt"
)

func main() {
    c := sha512_crypt.New()
    hash, err := c.Generate([]byte("rasmuslerdorf"), []byte("$6$usesomesillystringforsalt"))
    if err != nil {
        panic(err)
    }

    fmt.Println(hash)
}

При запуске он также выдает правильный хэш:

$6$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

Надеюсь, это ответит на ваш вопрос.

При реализации обратите внимание, что из соли используются только 16 символов, поэтому для соли возвращается тот же хэш usesomesillystri. Убедитесь, что вы выбрали случайные соли в производственном коде.

person fd0    schedule 05.10.2014
comment
Большое спасибо! Это именно то место, где я ищу. Он отлично работает с моими текущими хэшами паролей. - person Michael Tijhuis; 06.10.2014
comment
Как насчет rounds=5000? - person Qian Chen; 13.09.2017
comment
Кто-нибудь знает, почему c.Generate([]byte("enter-new-password"), []byte("$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2")) выдает ошибку invalid magic prefix? - person John; 01.07.2018
comment
Я ответил на свой собственный комментарий выше с помощью этого вопроса: stackoverflow.com/questions/51119682/ . У kless/osutil не было поддержки метода хэширования Blowfish, поэтому мне пришлось использовать другой модуль все вместе. Blowfish часто используется для PHP5.3 и ниже. - person John; 02.07.2018
comment
@John, эта ссылка показывает, какой алгоритм хеширования использовать на основе кода префикса: security.stackexchange.com/a/92150/71546< /а> - person colm.anseo; 17.10.2019
comment
Учтите, что эта библиотека, кажется, изменилась на github.com/tredoe/osutil/user/crypt/sha512_crypt - person Rodrigo; 11.05.2020
comment
Чтобы добавить одну вещь, которую я пробовал: если вы не хотите писать рандомизацию соли, как было предложено выше, все, что вам нужно, это передать пустую строку, т.е. соль := в следующей строке. эта утилита сама генерирует случайную соль/префикс ($6$) в c.Generate([]byte(plainText), []byte(salt)) - person Pramma; 24.02.2021