Senior
Van egy adatbázisunk a felhasználók jelszavaival, a jelszavak hash-elve vannak (hashPassword függvény), és ismert az a karakterkészlet is, amelyeket a jelszavakban lehet használni (alphabet változó). Feladatunk, hogy megvalósítsuk a RecoverPassword függvényt úgy, hogy az visszaállítsa a jelszót a ismert hash alapján, és a TestRecoverPassword sikeresen lefusson. Alapvető követelmények: Bárhogy megoldható package main import ( "crypto/md5" "fmt" ) var alphabet = []rune{'a', 'b', 'c', 'd', '1', '2', '3'} func RecoverPassword(h []byte) string { return "" } func hashPassword(in string) []byte { h := md5.Sum([]byte(in)) return h[:] } func main() {
sobes.tech MI
Válasz az MI-től
Для восстановления пароля по известному MD5-хэшу и заданному алфавиту нужно перебрать все возможные комбинации символов из alphabet, вычислить их хэш и сравнить с заданным. При совпадении вернуть найденный пароль.
Пример реализации с перебором паролей длиной от 1 до некоторого максимума (например, 5):
package main
import (
"crypto/md5"
"fmt"
)
var alphabet = []rune{'a', 'b', 'c', 'd', '1', '2', '3'}
func hashPassword(in string) []byte {
h := md5.Sum([]byte(in))
return h[:]
}
func RecoverPassword(h []byte) string {
maxLen := 5
var attempt func(pos int, current []rune) string
attempt = func(pos int, current []rune) string {
if pos == 0 {
// Проверяем текущую комбинацию
candidate := string(current)
if string(hashPassword(candidate)) == string(h) {
return candidate
}
return ""
}
for _, ch := range alphabet {
current[len(current)-pos] = ch
res := attempt(pos-1, current)
if res != "" {
return res
}
}
return ""
}
for length := 1; length <= maxLen; length++ {
current := make([]rune, length)
res := attempt(length, current)
if res != "" {
return res
}
}
return ""
}
func main() {
password := "abc1"
h := hashPassword(password)
recovered := RecoverPassword(h)
fmt.Printf("Original: %s, Recovered: %s\n", password, recovered)
}
Этот код перебирает все возможные пароли длиной до 5 символов из заданного алфавита, вычисляет их MD5-хэш и сравнивает с заданным. При совпадении возвращает найденный пароль.
Обратите внимание, что такой перебор может быть очень затратным по времени при большом алфавите и длине пароля.