2010-11-13 14 views
1

Je suis à la recherche d'un moyen simple de générer des mots de passe qui ne fonctionneront qu'une fois pendant une durée limitée, par ex. 1 jour, 1 semaine, 1 mois. Cela doit être implémenté dans une application qui n'a pas de connectivité, donc un serveur n'est pas possible. Le cas d'utilisation est quelque chose comme: 1. Générer un mot de passe pour une date et une durée spécifiques. 2. Envoyer à l'utilisateur (email, téléphone, etc.). 3. L'utilisateur entre dans l'application. 4. L'application est activée pour une durée spécifique. 5. Le mot de passe ne peut pas être réutilisé, même sur un autre PC. Je suppose que la seule façon de le faire est de générer des mots de passe qui ne fonctionnent que dans un ensemble de dates spécifique. Quelqu'un peut-il recommander un algorithme qui peut le faire? Il ne doit pas être incroyablement sécurisé, et je sais que vous pouvez le casser en réinitialisant l'heure sur le PC!Comment puis-je générer des mots de passe dépendant de la date?

Merci.

Répondre

1

Votre application doit avoir un attribut comme la validité pour quelque chose de mot de passe comme celui-ci

username password_hash validity_from Validity_end 
xyz  a73839$56  11-Nov-2010 12-Nov-2010 

puis dans votre application, vous pouvez vérifier que votre mot de passe a expiré ou non

+0

Peut-être que j'aurais dû dire la clé au lieu du mot de passe. Il n'y a pas de nom d'utilisateur et je ne veux pas générer les mots de passe à l'avance. – parsley72

0

Générer des mots de passe par toute méthode aimerais (une liste de mots, des lettres aléatoires, etc). Placez-les dans une structure de données, comme un tableau associatif, où vous pouvez associer une date à chaque mot de passe. Ensuite, vous consultez cette structure de données dans le programme qui distribue les mots de passe pour en donner un avec la bonne date d'expiration. Le programme client a la même liste de mots de passe et dates, donc quand il obtient un mot de passe, il recherche juste la date d'expiration associée là.

+0

Mais cela nécessite des mots de passe à générer à l'avance, avec une liste de dates. Si je m'attends à ce que le logiciel soit utilisé pendant 5 ans, c'est beaucoup de mots de passe. – parsley72

+0

Malheureusement, c'est le problème de faire fonctionner cette chose entièrement hors ligne. Il y a une raison pour laquelle toute activation de logiciel moderne nécessite une communication avec le fournisseur de logiciel. Vous êtes en ligne ou vous appelez pour activer. –

2

Je sais que je suis en retard, mais je vais quand même donner mes conseils au cas où quelqu'un d'autre qui en aurait besoin se retrouve ici.

Pour empêcher son utilisation sur un autre PC, vous pouvez probablement utiliser l'adresse MAC ou l'adresse matérielle. Cependant, cela dépend du matériel réseau restant disponible lors de la vérification du mot de passe. Veuillez vous assurer que vous utilisez l'adresse matérielle de la machine où le mot de passe sera vérifié. Pour limiter la date d'expiration, il suffit d'utiliser la chaîne de texte de la date d'expiration. Il suffit d'utiliser une fonction de hachage pour hacher la date d'expiration de la moissonneuse-batteuse, l'adresse matérielle et une clé secrète. Préfixe ou suffixe la sortie de hachage avec la date d'expiration.

private void GeneratePassword(string prefix) 
    { 
     string secretKey = "MySecretKey"; 
     System.Security.Cryptography.SHA1 sha = System.Security.Cryptography.SHA1.Create(); 
     byte[] preHash = System.Text.Encoding.UTF32.GetBytes(prefix + secretKey + GetBase64Mac()); 
     byte[] hash = sha.ComputeHash(preHash); 
     string password = prefix + System.Convert.ToBase64String(hash); 
     return password; 
    } 

Dans le cas ci-dessus, je préfixer le hash avec la date de péremption. Ainsi, lorsque nous vérifions le mot de passe, nous extrayons simplement la date d'expiration du mot de passe, utilisons la même fonction pour générer le même mot de passe. Si le mot de passe généré correspond au mot de passe fourni, vous avez le feu vert.

private void TestPassword() 
    { 
     int duration = 15; // in days 
     string prefix = GetExpiryDate(DateTime.Today.AddDays(duration)); 
     string generated = GeneratePassword(prefix); 

     // Positive test 
     string testPrefix = generated.Substring(0, 8); 
     string testPassword = GeneratePassword(testPrefix); 

     if (generated != TestPassword) 
      return false; 

     // Negative test 
     generated[2] = '2'; 
     generated[12] = 'b'; 

     testPrefix = generated.Substring(0, 8); 
     testPassword = GeneratePassword(testPrefix); 
     if (generated != TestPassword) 
      return true; 

     return false; 
    } 

mot de passe Exemple de sortie:

20110318k3X3GEDvP0LkBN6zCrkijIE + snc =

Si vous ne pouvez pas obtenir l'adresse du matériel, puis utilisez simplement le nom du client.Cela n'empêchera pas l'utilisation du mot de passe sur plusieurs machines, mais assurera que la même personne l'utilise.