-1

J'ai écrit une fonction de hachage pour la génération de mot de passe et de clé, mais j'ai réalisé assez rapidement que pouvoir inverser le hachage était très utile, donc j'ai écrit une fonction inverse, cependant, cela fonctionne. Je ne comprends pas pourquoi cela ne fonctionne pas.Pourquoi cette fonction unhash ne pas inverser ce hachage?

function hash64(n:uint):uint 
{ 
    n = (~n) + (n << 21); 
    n = n^(n >> 24); 
    n = (n + (n << 3)) + (n << 8); 
    n = n ^(n >> 14); 
    n = (n + (n << 2)) + (n << 4); 
    n = n^(n >> 28); 
    n = n + (n << 31); 
    return n; 
} 

function unhash64(n:uint):uint 
{ 
    n = (~n) - (n >> 21); 
    n = n^(n << 24); 
    n = (n - (n >> 3)) - (n >> 8); 
    n = n^(n << 14); 
    n = (n - (n >> 2)) - (n >> 4); 
    n = n^(n << 28); 
    n = n - (n >> 31); 
    return n; 
} 

Sortie dans l'alimentation 1000:

Hashed from 1000:   1221775646 
Unhash output:    1963490760 
+0

Qu'avez-vous prévu? 1000? – Organis

+0

Oui, c'est impossible? – ZxZ

+3

C'est le but de la cryptographie, en fait: il ne devrait pas être ** possible de recréer les données d'origine à partir du hachage. Autrement que la force brute au cours des années, que cela. – Organis

Répondre

5

Le premier problème évident est que cela ne se reflète pas dans le temps. Que fonctionne parfois (si l'ordre des opérations n'a pas d'importance en premier lieu), mais en général l'inverse de y = f(g(x)) est x = g⁻¹(f⁻¹(y)). f a été appliqué en dernier, donc il doit être défait en premier. Comparez: si vous mettez d'abord vos chaussettes et ensuite vos chaussures, vous devriez probablement enlever vos chaussures d'abord, puis vos chaussettes.

En outre, de nombreux inverses sont tout simplement faux pour commencer. Par exemple, l'inverse de
m = n^(n >> 24) est n = m^(m >> 24) et l'inverse de m = (n + (n << 2)) + (n << 4) est n = m * 0x3cf3cf3d (il s'agit d'un modular multiplicative inverse). Ce n'est pas aussi simple que la direction du changement de vitesse.

Non testé, mais ce sont tous les inverses dans le bon ordre:

n = n * 0x80000001; 
n = n^(n >> 28); 
n = n * 0x3cf3cf3d; 
n = n^(n >> 14)^(n >> 28); 
n = n * 0x1c03dd39; 
n = n^(n >> 24); 
n = (n + 1) * 0xffdfffff; 
1

hashs ne sont pas réversibles. Si vous voulez une fonction réversible qui masque l'entrée d'origine, utilisez plutôt un cryptage. Les chiffrements sont conçus pour être réversibles, tant que vous avez la bonne clé.

Il existe déjà des techniques bien connues pour la génération de mot de passe et de clé. Si vous essayez de concevoir vos propres versions, elles ne seront pas sécurisées. Ce n'est pas grave, tout ce que vous voulez faire est de cacher les choses à votre petit frère. Si vous travaillez dans le domaine commercial, vous pourriez être poursuivi en justice, alors utilisez toutes les méthodes sécurisées standard existantes. Vous pouvez rechercher des fonctions de dérivation de clé comme PBKDF2 ou argon2.