app.py 3,12 ko
Newer Older
from flask import Flask, request, jsonify
import hashlib
import itertools

app = Flask(__name__)

# Simuler une base de données en mémoire
resolved_hashes = {
    "5d41402abc4b2a76b9719d911017c592": "hello",  # Exemple de hash déjà résolu
    "098f6bcd4621d373cade4e832627b4f6": "test"
}

@app.route("/bruteforce", methods=["POST"])
def bruteforce():
    """
    Endpoint pour bruteforcer un hash MD5.
    Reçoit un hash MD5 via un payload JSON et retourne la chaîne brute correspondante.
    """
    # Vérifier si le payload contient un hash
    data = request.json
    if not data or "hash" not in data:
        return jsonify({
            "status": "fail",
            "data": None,
            "errors": {
                "message": "Invalid payload. Please provide a valid hash."
            }
        }), 400

    target_hash = data["hash"]

    # Vérifier si le hash existe déjà dans la base
    if target_hash in resolved_hashes:
        return jsonify({
            "status": "success",
            "data": {
                "hash": target_hash,
                "original": resolved_hashes[target_hash]
            },
            "errors": None
        }), 200

    # Logique de bruteforce
    charset = "abcdefghijklmnopqrstuvwxyz0123456789"
    for length in range(1, 8):  # Limite la longueur des combinaisons pour les performances
        for guess in itertools.product(charset, repeat=length):
            guess_str = ''.join(guess)
            if hashlib.md5(guess_str.encode()).hexdigest() == target_hash:
                # Ajouter le résultat dans la "base"
                resolved_hashes[target_hash] = guess_str
                return jsonify({
                    "status": "success",
                    "data": {
                        "hash": target_hash,
                        "original": guess_str
                    },
                    "errors": None
                }), 200

    # Si aucune correspondance n'est trouvée
    return jsonify({
        "status": "fail",
        "data": None,
        "errors": {
            "message": "No match found for the provided hash."
        }
    }), 404

@app.route("/resolved", methods=["GET"])
def get_resolved_hashes():
    """
    Endpoint pour récupérer tous les hash résolus.
    """
    return jsonify({
        "status": "success",
        "data": list(resolved_hashes.items()),  # Convertir en liste de tuples [(hash, original), ...]
        "errors": None
    }), 200


@app.route("/resolved/<string:hash_value>", methods=["GET"])
def get_resolved_hash(hash_value):
    """
    Endpoint pour récupérer un hash spécifique.
    """
    if hash_value in resolved_hashes:
        return jsonify({
            "status": "success",
            "data": {
                "hash": hash_value,
                "original": resolved_hashes[hash_value]
            },
            "errors": None
        }), 200
    else:
        return jsonify({
            "status": "fail",
            "data": None,
            "errors": {
                "message": f"No resolved entry found for hash: {hash_value}"
            }
        }), 404


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)