Я работаю над своим модулем авторизации в 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.
Заранее спасибо.
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
, Убедитесь, что вы выбрали случайные соли в производственном коде.
Других решений пока нет …