2017-07-05 1 views
0

Je veux faire du code unique avec sha1 avec sel unique (définitivement unique parce que j'utilise id de la table). J'ai besoin d'un code unique avec 7 caractères, mais je ne peux pas utiliser l'identifiant de ma table parce que c'est plus de 7 caractères. Donc, je pense qu'il est préférable d'utiliser sha1 et de prendre le premier caractère 7 du texte haché comme mon code unique. La longueur du texte à hacher affecte-t-elle la probabilité d'une collision?La longueur du texte à hacher affecte-t-elle la probabilité d'une collision?

par exemple:

textA = "myId:12345678" 
textB = "myId:12345678, myId2:87654321" 

Est-il préférable d'utiliser un texte long court (par exemple TEXTA) ou texte (par exemple textb)? Ou est-ce que la longueur du texte n'a aucun effet?

+0

Voir également le travail de Kelsey sur [Troncs de hachage] (https://www.google.com/search?q=kelsey+truncated+hash). Il n'y a aucune réduction de la preuve qu'un hachage tronqué possède les mêmes propriétés qu'un hachage complet. Si possible, vous devriez éviter la troncature. Peut-être que vous pouvez utiliser [Format Preserving Encryption] (https://www.google.com/search?q=Format+Preserving+Encryption). FPE a des preuves d'accompagnement. – jww

Répondre

1

Hacher vos identifiants uniques est une mauvaise idée. Ne fais pas ça.

Si vos identifiants se composent de 7 chiffres hexadécimaux, cela vous donne 268,435,456 valeurs uniques à jouer avec. Si vous hachez ces valeurs et tronquez les résultats à 7 chiffres hexadécimaux, alors the probability of a collision rises very quickly (probabilité de 1% après 2 322 entrées, 50% après 19 290 entrées, 99% après 35 159 entrées).

Si votre objectif est de masquer ces valeurs d'ID de manière à ce qu'un adversaire ne puisse pas déterminer quelles sont les valeurs séquentielles réelles, utilisez plutôt format-preserving encryption.

Édition: Si vous avez besoin de quelque chose de solide, vous pouvez essayer d'installer un Feistel network en utilisant une fonction de cryptage comme AES comme la fonction rond. (. AES est surpuissant, peut-être, mais cela pourrait être mis en œuvre en quelques lignes de code dans la plupart des langues basées sur des primitives existantes) Si vous voulez juste masquer les ID, vous pouvez utiliser quelque chose de simple comme ceci:

def obfuscate_id(id, key): 
    # Transforms id using a 28-bit key 
    a = 81883721 # (random prime congruent to 1 mod 4) 
    c = 2791751 # (any odd number will do) 
    m = 2**28  # (modulus for 7-digit hex values) 
    return ((id^key) * a + c) % m 
+0

et jww merci pour votre suggestion. J'ai lu sur le format-préservation-cryptage. En fait, je ne vise pas à déguiser ces valeurs d'ID mais je veux faire du code aléatoire et unique (7 ou 8 cordes seulement). Je pense que je peux utiliser ces ID pour un code unique mais mon ID a beaucoup de caractère. Donc j'ai besoin de faire 7 ou 8 chiffres. Si possible, laissez-moi savoir comment je peux le faire. Merci –

+0

@FerryGideon Désolé pour le retard; J'ai mis à jour la réponse légèrement. –