J'ai l'intention d'utiliser un UNIQUEIDENTIFIER
comme clé d'accès que les utilisateurs peuvent utiliser pour accéder à certaines données. La clé servira de mot de passe dans ce sens.
J'ai besoin de générer plusieurs identifiants de ce type dans le cadre d'une INSERT...SELECT
déclaration. Pour des raisons architecturales, je veux générer les identifiants côté serveur dans ce cas.
Comment puis-je générer un aléatoire en toute sécurité UNIQUEIDENTIFIER
? Notez que NEWID
ce ne serait pas assez aléatoire car cela ne promet aucune propriété de sécurité. Je recherche l'équivalent SQL Server de System.Security.Cryptography.RandomNumberGenerator car j'ai besoin d'identifiants invisibles. Tout ce que basé sur CHECKSUM
, RAND
ou GETUTCDATE
ne serait pas admissible aussi.
4
. Mais le fait que je n'ai pas de preuves solides qu'ils pourraient être devinables ne signifie pas qu'ils ne le sont pas. Je ne peux pas fonder cette décision de sécurité sur cette observation.Réponses:
Devrait faire le tour que j'aurais pensé.
CRYPT_GEN_RANDOM
la source
Juste mes deux cents, mais ce n'est peut-être pas une bonne idée. Pour paraphraser l'excellente série d'Eric Lippert sur les GUID ( partie 1 , partie 2 , partie 3 ), l'acronyme est GUID, pas GSUID - Globally Unique Identifier, pas Globally Secure Unique Identifier.
Le problème réside dans le fait que lorsque les GUID sont générés dans une portée non hostile, comme tout le monde utilisant NEWID (), toutes les valeurs sont garanties comme étant uniques (enfin, en quelque sorte, voir l'article d'Eric, partie 3). Mais si une entité hostile entre dans cette portée, elle peut à la fois prédire le prochain GUID généré et provoquer elle-même des collisions.
En créant votre propre méthode de génération d'une valeur que vous stockez à l'intérieur d'une structure qui ressemble à un GUID, vous êtes essentiellement devenu une entité hostile. Vous avez changé le contrat d'un GUID de l' unique à aléatoire . Alors que quelqu'un de meilleur en mathématiques que moi pourrait probablement prouver que vous êtes toujours unique, ce n'est que dans les limites de votre méthode de génération. Si vous mélangez ces pseudo-GUID avec des GUID NEWID (), tous les paris sont désactivés.
Je dis que ce n'est peut-être pas une bonne idée uniquement parce que je ne connais pas toute la portée de la façon dont vous utilisez les valeurs. Si vous êtes la seule entité générant les valeurs (pas de mix and match), et / ou si vous ne persistez pas les valeurs, et / ou que vous ne vous souciez pas des collisions, cela peut ne pas être un problème. Si l'un de ces éléments n'est pas vrai, vous voudrez peut-être réévaluer.
la source
UNIQUEIDENTIFIER
est surtout une coïncidence. Il est juste pratique de gérer une quantité de 16 octets en utilisant ce type. Je pense que c'est un mot de passe. Cela doit cependant être unique. Je suis convaincu que je ne verrai jamais de collision (et même s'il y a l'application, elle se bloquera - c'est donc aussi sûr).Selon https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newsequentialid-histrorybenefits-and-implementation/ , la fonction NEWID () enveloppe simplement la fonction Windows CoCreateGuid, qui renvoie un GUID de style v4 . Et selon https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11 , depuis Windows 2000 en 1999,
Donc, je dirais que vous pourriez considérer NEWID () cryptographiquement sécurisé - au moins dans la mesure des 122 bits d'entropie qu'il fournit.
la source