Vous connaissez (peut-être ?) le site de Troy Hunt HaveIBeenPwned, qui permet de savoir si son adresse électronique, son site ou son mot de passe a été déjà compromis et retrouvé dans des listes de données piratées lors des intrusions diverses sur des sites (Adobe, Playstation network, Vtech, etc.)

La liste se trouve sur ici.

Ce qui m’intéresse là, c’est de vérifier si des mots de passe ont fuité. En effet, comme beaucoup j’utilise un gestionnaire de mot de passe depuis quelques années (keypass2 en l’occurrence), mais j’ai longtemps utilisé un panel de mots de passes pour mes différentes inscriptions, et il est même possible qu’il en reste encore qui traîne.

Sur le site, il y a une zone pour tester son mot de passe. La base de données de mots de passes compromis contient environ 12 milliard d’entrées…

C’est crypté via TLS, et il est probable que les mots de passe saisis soient cryptés avant de transiter. Mais quand même. Ça fait un peu peur de se dire qu’on va taper son précieux mot de passe sur un site tiers.

Ça tombe bien, Troy Hunt met aussi à disposition une API permettant de tester une forme cryptée (SHA-1) du mot de passe. Et pour être sûr qu’on ne transmet rien en entier, seuls les 5 premiers caractères sont envoyés, et la liste de tous les hash commençant par ces 5 caractères est retournée, comme ça, plus qu’à tester en local (principe expliqué ici)

Du coup, on peut très simplement se faire en local une petite page pour tester. Pour ça, un peu de HTML, un peu de JS, et un peu de jQuery (parce que j’ai eu la flemme de faire de l’ajax…)

Le fichier HTML :

 1    <!DOCTYPE html>
 2    <html lang="fr">
 3        <head>
 4            <meta charset="UTF-8">
 5            <title>Password test</title>
 6        </head>
 7        <body>
 8            <h1 id="thisH1"></h1>
 9            <input type="text" name="hibp" id="hibp">
10            <button id="HIBPButton">Have I been pwnd ?</button>
11            <script src="jquery-2.2.3.min.js"></script>
12            <script src="index.js"></script>
13            <div id="result"></div>
14        </body>
15    </html>

Et le code JS (index.js)

 1    // Ajout d'un évènement sur le clic du bouton
 2    document.getElementById("HIBPButton").addEventListener("click", function(){
 3        // Récupérer le mot de passe
 4        var passwd = document.getElementById('hibp').value;
 5
 6        // Encoder en SHA1
 7        var sha1   = SHA1(passwd).toUpperCase();
 8
 9        // Découper pour envoyer à l'API
10        var short  = sha1.substring(0,5);
11        var rest   = sha1.substring(5);
12
13        document.getElementById('result').innerHTML = "";
14        document.getElementById('thisH1').innerText = short; // Affichage pour la curiosité
15
16        $.ajax({
17            url : "https://api.pwnedpasswords.com/range/"+short,
18            method : "GET",
19            dataType : "text",
20            success : function (data) {
21                // Afficher l'encodage. Oui, ça ne sert à rien.
22                document.getElementById('thisH1').innerText = short + ' - ' + rest;
23
24                // Transformer la chaîne de retour en tableau
25                var result = data.split("\r\n");
26
27                // Init de la chaîne affichée à la fin
28                var htmlResult = "Not found, cool !";
29
30                // Balayer les éléments
31                result.forEach(element => {
32                    var entry = element.split(':');
33                    if (entry[0] == rest) {
34                        htmlResult = "<strong>Pwned " + entry[1] + " time";
35                        htmlResult = (entry[1]>1) ? htmlResult + "s !</strong>" : " !</strong>";
36                    }
37                });
38                
39                document.getElementById('result').innerHTML = htmlResult;
40            },
41            error : function (reason, xhr){
42                console.log("error in processing your request", reason);
43            }
44        });
45
46    });

Et voilà. C’est tout. Pour la fonction SHA1, utilisez ce que vous voulez, moi j’ai utilisé celle-là http://webtoolkit.info/javascript_sha1.html.

En testant avec « password », on apprend qu’il a été retrouvé plus de 3 millions de fois dans ces listes. Wééé…

Test avec le mot de passe password

Crédit photo : Kris - TheDigitalWay