Sobes.tech
Middle+

We hebben een database met gebruikerswachtwoorden, de wachtwoorden zijn gehasht (functie hashPassword), en het bekende set van tekens dat in wachtwoorden kan worden gebruikt (variabele alphabet). Onze taak is om de functie RecoverPassword te implementeren zodat deze het wachtwoord herstelt op basis van de bekende hash en dat TestRecoverPassword succesvol wordt afgerond. Basisvereisten: Elke methode is toegestaan 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() { tests := []string{"a", "12", "abc333d"} ok := true for _, exp := range tests { h := hashPassword(exp) act := RecoverPassword(h) if act != exp { fmt.Printf("Fout: verwacht %q, gekregen %q\n", exp, act) ok = false } } if ok { fmt.Println("Tests succesvol doorstaan") } }

sobes.tech AI

Antwoord van AI

Задача — по известному MD5-хэшу и алфавиту восстановить исходный пароль. Поскольку MD5 — хеш-функция, обратного преобразования нет, но можно перебрать все возможные комбинации из alphabet и сравнить их хэш с заданным.

Для успешного прохождения тестов нужно реализовать перебор паролей с длиной от 1 до максимальной длины тестовых паролей (например, до 7 символов).

Пример решения с рекурсивным перебором:

func RecoverPassword(h []byte) string {
    var result string
    var found bool

    var dfs func(current []rune)
    dfs = func(current []rune) {
        if found {
            return
        }
        if len(current) > 0 {
            if stringHash := hashPassword(string(current)); stringHash != nil && stringEqual(stringHash, h) {
                result = string(current)
                found = true
                return
            }
        }
        if len(current) == 7 { // максимальная длина из тестов
            return
        }
        for _, c := range alphabet {
            dfs(append(current, c))
        }
    }

    dfs([]rune{})
    return result
}

func stringEqual(a, b []byte) bool {
    if len(a) != len(b) {
        return false
    }
    for i := range a {
        if a[i] != b[i] {
            return false
        }
    }
    return true
}

Такой перебор гарантирует нахождение пароля из заданного алфавита и длины до 7 символов. В реальных условиях перебор может быть дорогим, но для теста и ограниченного алфавита подходит.