Sobes.tech
Senior

Nous avons une base de données avec des mots de passe utilisateur, les mots de passe sont hachés (fonction hashPassword), et nous connaissons également l'ensemble des caractères pouvant être utilisés dans les mots de passe (variable alphabet). Notre tâche est d'implémenter la fonction RecoverPassword pour qu'elle restaure le mot de passe à partir du hash connu et que TestRecoverPassword réussisse. Exigences de base: Tout moyen est acceptable 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 IA

Réponse de l'IA

Pour récupérer un mot de passe à partir d’un hash MD5 connu et d’un alphabet donné, il faut essayer toutes les combinaisons possibles de caractères de l’alphabet, calculer leur hash et le comparer avec le hash donné. Lorsqu’une correspondance est trouvée, le mot de passe est renvoyé.

Exemple d’implémentation avec une tentative de mots de passe de longueur allant de 1 à un maximum (par exemple, 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 {
            // Vérifie la combinaison actuelle
            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)
}

Ce code essaie toutes les combinaisons possibles de mots de passe jusqu’à 5 caractères à partir de l’alphabet donné, calcule leur hash MD5 et le compare avec le hash fourni. Lorsqu’une correspondance est trouvée, il renvoie le mot de passe trouvé.

Notez que cette méthode de recherche peut être très coûteuse en temps si l’alphabet et la longueur du mot de passe sont grands.