9
votes

ID utilisateur Obfuscation

Je m'attends à ce que cela a été demandé avant, mais je n'ai pas vraiment trouvé une réponse appropriée ici et que vous n'avez pas le temps de proposer ma propre solution ...

Si nous avons une table d'utilisateur avec int Identity clé primaire, nos utilisateurs ont des identifiants consécutifs lorsqu'ils s'inscrivent sur le site.

La page de profil public de l'utilisateur sur le URL du site: xxx

où 1234 est l'ID utilisateur réel. Il n'y a rien de vulnérable pour voir l'identifiant de l'utilisateur en soi , mais il donne à quiconque la possibilité de vérifier combien d'utilisateurs sont inscrits sur mon site ... L'augmentation manuelle du nombre est devenu un profil invalide.

C'est la raison principale pour laquelle je parle d'une carte d'identité réversible à un nombre apparemment aléatoire avec une longueur fixe: xxx pouvez-vous signaler à un simple classe qui fait cette cartographie? Il est bien entendu important que cette mappage soit simplement réversible, sinon je devrais enregistrer la cartographie avec les autres données de l'utilisateur.

Je souhaite éviter les GUID

GUDS est plus lent à index. recherchez-les car ils ne sont pas consécutifs, SQL doit numériser l'intégralité de l'index pour correspondre à un GUID particulier, une page d'index calculée particulière ...

Si j'aurais un ID + GUID, alors je voudrais toujours Besoin d'aller chercher l'ID utilisateur d'origine pour faire une manipulation de données significative qui est à nouveau une vitesse de vitesse de la vitesse ...

une permutation entière réversible mathématique semble la solution la plus rapide ...


3 commentaires

Pourquoi est-ce un problème si quelqu'un peut déterminer le nombre d'utilisateurs enregistrés sur le site? Vous n'avez pas à commencer à 1!


Avez-vous envisagé d'utiliser des GUID? Même si votre table existe déjà, vous pouvez générer un GUID pour chaque ligne et utiliser cela pour la cartographie


@Jonathonbolster: les GUDS sont mauvais pour l'indexation SQL car la recherche est plus lente (juste par GUID SQL ne peut pas savoir sur quel résultat de la page sera) ... et que ID + GUID nécessite une requête SQL supplémentaire pour obtenir des données d'utilisation réelle pour effectuer des données. Manipulation ... J'aimerais éviter les GUID pour ces deux raisons.


3 Réponses :


0
votes

Puis-je vous suggérer d'utiliser une UUID à la place. Cela pourrait être indexable et généré dans une procédure stockée lorsque vous ajoutez un nouvel utilisateur à la base de données. Cela signifierait soit l'ajout d'une nouvelle colonne à la table de base de données ou à une nouvelle table contenant des uuids, mais avec l'ID utilisateur en tant que clé associée.

Modifier

Si vous voulez vraiment éviter les GUID, pourquoi ne pas utiliser les utilisateurs "Nom d'utilisateur" tandis qu'ils accèdent à leur page de profil. Après tout, j'imagine que vous n'ayez attribuez à un utilisateur un identifiant avant d'avoir saisi des informations valides et que les données ont été enregistrées dans la base de données.


1 commentaires

Consultez mon commentaire à @jonathonbolster Quelles sont les raisons pour éviter d'utiliser des GUID (qui sont les UUIDS de Microsoft).



16
votes

Je vais à 100% avec l'approche "Ajoutez une colonne de gestion de la table". Il faudra des secondes pour générer un pour chaque utilisateur actuel et mettre à jour votre procédure d'insertion pour générer un pour chaque nouvel utilisateur. C'est la meilleure solution.

Cependant, si vous vraiment em> ne voulez pas prendre cette approche, il y a un nombre quelconque de techniques d'obfuscation que vous pouvez utiliser. P>

simple base64 codant sur la chaîne La représentation de votre numéro est une méthode (mauvaise) de le faire. P>

static int Prime = 1580030173;
static int PrimeInverse = 59260789;

public static int EncodeId(int input)
{
    return (input * Prime) & int.MaxValue;
}

public static int DecodeId(int input)
{
    return (input * PrimeInverse) & int.MaxValue;
}


8 commentaires

Comme je l'ai décrit dans le commentaire à @jonathonbolster, j'aimerais éviter les GUID pour la rapidité et l'ajout de raisons d'interrogation.


Oh oui ... Le calcul des nombres premiers est génial! beaucoup mieux que le codage de base64.


Comment se rapporte-t-il le prime et la primenverse? Je veux dire, pouvez-vous calculer le primenverse lorsque j'ai une autre prime que 1580030173


@MICHEL - La réponse à celle-ci est liée à cette réponse: Cela suive Up Post par un autre Auteur explique comment sécuriser cela un peu plus avec un Xor aléatoire, ainsi que comment calculer le Prime et le primeRevere


Voici un lien de travail pour le message suivant: Miguelsanmiguel.com/obfuscation


Tous les liens de travail sur la relation entre l'int.max et les prime?


@Visualbean: J'ai trouvé une belle explication et un code ici: Blog de Eric Lippert de celui-ci, j'ai pu faire une calculatrice inverse multiplicative C #. Notez que le calcul de l'encodage / décodage en C # à l'aide de valeurs INT ressemble davantage à: retour (int) (math.bigmul (entrée, prime)% int.maxvalue); qui évite le débordement entier. (Ou vous pouvez transformer les préoccupations de débordement à l'aide de non cochée, mais je pense que le ci-dessus sert mieux l'intention de l'Alogrime.)


Voici un article référençant le blogpost mentionné: robvs.wordpress.com/2010/07/08/... et la version archivée pour calculer Prime et primeRenvers: web.archive.org/web/20120711235339/http://miguelsanmiguel.co m / ...



1
votes
  1. Utilisez UUIDS

  2. Faites une autre colonne de la table des utilisateurs, par exemple. 64 bits entiers et remplissez-le avec un nombre aléatoire (chaque fois qu'un nouvel utilisateur enregistré - génère-le et vérifiez qu'il est unique). Un nombre est meilleur que UUID, mais un peu plus de codage requis.

  3. Utilisez les mathématiques. ;) Vous pouvez générer une paire de chiffres x , y tel que x * y = 1 (mod m) . Par exemple. x = 10000000019L , y = 1255114267L et m = 2 ^ 30 . Ensuite, vous aurez deux fonctions simples:

    . xxx

    Il produira des ID codés presque aléatoires. C'est facile, mais piraillable. Si quelqu'un prendrait la peine de le pirater, il sera en mesure de deviner vos chiffres et de voir aussi des valeurs codées. Cependant, je ne suis pas totalement sûr de la complexité c'est, mais comme je me souviens que ce n'est pas très facile à pirater.


2 commentaires

Le piratage n'est pas un problème ... Je ne crois pas les données sensibles ... Les identifiants sont publics ... mais aimeraient simplement les obscurcir ...


Lorsque vous essayez la troisième option. Si vous décidez de l'utiliser, je me souviens d'algèbre d'expliquer comment générer des numéros et y pour votre propre. Vous devriez les garder en secret, tout le monde qui les connaissent est capable de décoder vos identifiants codés.