Эта строка кода в PHP оценивается как true
echo '$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2' == crypt("enter-new-password",'$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2');
Что мне нужно, так это криптовая функция на Голанге, которая также оценивает как истинную.
ПОПЫТКА 1
Я пытался это, но это оценивается как ложное:
import "github.com/nyarla/go-crypt"log.Println("$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2" == crypt.Crypt("enter-new-password","$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2"))
ПОПЫТКА 2
Я также попытался определить и использовать эту функцию crypt, которую я нашел где-то еще, но она также вернула false:
package main
import (
"fmt""unsafe")
// #cgo LDFLAGS: -lcrypt
// #define _GNU_SOURCE
// #include <crypt.h>
// #include <stdlib.h>
import "C"
// crypt wraps C library crypt_r
func crypt(key, salt string) string {
data := C.struct_crypt_data{}
ckey := C.CString(key)
csalt := C.CString(salt)
out := C.GoString(C.crypt_r(ckey, csalt, &data))
C.free(unsafe.Pointer(ckey))
C.free(unsafe.Pointer(csalt))
return out
}
ПОПЫТКА 3
Я также попробовал это, но, похоже, он не поддерживает CRYPT_BLOWFISH, который использовался в более раннем PHP5.3 и более ранних версиях:
Почему мой пакет crypt выдает мне неправильный магический префикс ошибки?
Итак, мой вопрос:
Как заставить функцию крипта golang вести себя точно так же, как функция крипта PHP для строк enter-new-password
а также $2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2
?
Хотя я не нашел точного «Go crypt function», эквивалентного PHP crypt function, я нашел альтернативу.
Следующее решило мою проблему
import "golang.org/x/crypto/bcrypt"// check will be nil if the bcrypt version of "enter-new-password" is the same as the "$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2" . Otherwise check will be an error object
check := bcrypt.CompareHashAndPassword([]byte("$2a$09$f5561d2634fb28a969f2dO8QeQ70f4bjCnF/.GvPpjj.8jgmtzZP2"),[]byte("enter-new-password"))
log.Println(check)
golang.org/x/crypto/bcrypt/bcrypt_test.go
Есть несколько полезных примеров использования этого модуля.
Очевидно, что в PHP-функции crypt есть много разных способов хэширования значений, таких как sha256, sha512, blowfish и т. Д. Кажется, существует множество модулей go lang, но вы должны явно указать тип хеша, стоимость и т. Д. На мой вопрос о существовании $2a$
в качестве префикса к значению хеша предлагается использовать хэш типа Blowfish. Некоторые из моих предыдущих попыток не учитывали это. Фактически, модуль в попытке 3 не имеет поддержки blowfish.
Других решений пока нет …