Avatar billede radiv Nybegynder
15. februar 2005 - 12:21 Der er 13 kommentarer og
1 løsning

Generere adgangskode og password

Til et onlinesystem skal jeg have genereret x antal adgangskode/password kombinationer.

Krav:
Mulighed for et stort antal kombinationer
Nemt at eksportere til en database
Jeg skal kunne angive hvilke tegn der skal anvendes (fx. skal ikke visuelt lige tegn bruges, som 1 og l eller B og 8)
Det må gerne være billig eller gratis

Jeg forestiller mig at kunne generere fx 100000 kombinationer, importere dem i min database, og på et senere tidspunkt kunne generere flere kombinationer.

Jeg vurdere at kode det selv, men findes der en eksisterende løsning bruger jeg da heller tiden til noget andet.
Avatar billede arne_v Ekspert
15. februar 2005 - 12:31 #1
Det kan laves med ret få linier kode.
Avatar billede arne_v Ekspert
15. februar 2005 - 12:32 #2
Java version:

  private final static char[] valid = { 'A', 'B', 'C', '1', '2', '3' };
  private final static Random rng = new Random();
  public static String newpassword(int l) {
      StringBuffer sb = new StringBuffer("");
      for(int i = 0; i < l; i++)  {
        sb.append(valid[rng.nextInt(valid.length)]);
      }
      return sb.toString();
  }
Avatar billede arne_v Ekspert
15. februar 2005 - 12:32 #3
(hvis du ikke vil have 1 så fjerner du dne bare fra listen over valide tegn)
Avatar billede radiv Nybegynder
15. februar 2005 - 14:06 #4
Jeg forsøger at oversætte til C#, men kan ikke helt se hvad der tilsvarer StringBuffer. Er det en StringBuilder?

Adgangskoden skal også være en random tegnkombination.

Eksempel på hvad jeg ønsker at generere:

nfg462s;ur37s29
23py4db;wqa328n
etc.
Avatar billede arne_v Ekspert
15. februar 2005 - 14:17 #5
Ja.

C# StringBuilder = Java StringBuffer

Du definerer de valide tegn og kalder newpassword for både brugernavn
og password med den ønskede længde.
Avatar billede radiv Nybegynder
15. februar 2005 - 14:49 #6
OK.

Men hvor "random" er den?
Når jeg kalder metoden flere gange i træk, giver den det samme resultat.

public string newPassword(int l)
        {
            char[] valid = { 'A', 'B', 'C', '2', '3', '4' };
            Random rng = new Random();

            StringBuilder sb = new StringBuilder("");
            for(int i = 0; i < l; i++) 
            {
                sb.Append(valid[rng.Next(valid.Length)]);
            }
            return sb.ToString();
        }
Jeg har så en anden metode newCode, som blot indeholder nogle andre tegn.

Hvis jeg forsøger at generere 5 kombinationer med

for(int i = 0; i < 5; i++) 
{
  newCode(6));
  newPassword(6));
}

Giver den det samme resultat hver gang, og sekvensen er den samme i "kode" som i "password". Hvordan får jeg forskellige koder, og kode og password med ulige mønstre?
Avatar billede arne_v Ekspert
15. februar 2005 - 14:52 #7
Den er meget random.

Hvis man bruger den korrekt !

private Random rng = new Random();
public string newPassword(int l)
        {
            char[] valid = { 'A', 'B', 'C', '2', '3', '4' };

            StringBuilder sb = new StringBuilder("");
            for(int i = 0; i < l; i++)
            {
                sb.Append(valid[rng.Next(valid.Length)]);
            }
            return sb.ToString();
        }
Avatar billede radiv Nybegynder
15. februar 2005 - 15:30 #8
OK, jeg har rettet til så den danner forskellige strings for hvert nye kald.
Men hvordan kan jeg få min metode newPassword til at lave password som ikke følger det samme mønster som newCode?

Lige nu bliver en kode fx DEF567, mens et password bliver ABC234 (jeg er ikke så kreativ med tegn endnu). Problemet er altså at et tegn i kode altid tilsvarer tegnet på samme position i char[] i password.
Avatar billede arne_v Ekspert
15. februar 2005 - 15:39 #9
Det forstår jeg ikke helt.

using System;
using System.Text;

class MainClass
{
    private static Random rng = new Random();
    public static string newPassword(int l)
    {
        char[] valid = { 'A', 'B', 'C', '2', '3', '4' };
        StringBuilder sb = new StringBuilder("");
        for(int i = 0; i < l; i++)
        {
            sb.Append(valid[rng.Next(valid.Length)]);
        }
        return sb.ToString();
    }
    public static void Main(string[] args)
    {
        for(int i = 0; i < 10; i++)
        {
            string brugernavn = newPassword(6);
            string kodeord = newPassword(6);
            Console.WriteLine(brugernavn + " " + kodeord);
        }
    }
}

giver:

44AAAC AA4AA4
2CC323 A324BC
2C2B3B A4CCBA
A43232 4B3243
33CAB4 AA32C2
34C2AA 2ABC33
A24A4A 24C4C4
4A32CA CCCA34
BCB243 2CA2A2
4AA2A2 B3CC24
Avatar billede radiv Nybegynder
15. februar 2005 - 16:19 #10
Jeg dropper den anden metode, for kode og password kan godt indeholde de samme tegn. Så kører det.

Vil det være mulig at identiske koder dannes?
Det kan jeg vel løse blot ved at fjerne duplikater når jeg får kodene ind i databasen? Om et password er identisk med en kode gør ikke så meget.

Og et matematisk spørgsmål til sidst: Antallet mulige kombinationer er vel længden på strengen opløftet i antallet af gyldige tegn?
Avatar billede arne_v Ekspert
15. februar 2005 - 16:28 #11
omvendt:

antal gyldige ten opløftet til længden på strengen
Avatar billede arne_v Ekspert
15. februar 2005 - 16:30 #12
Og principielt kan der godt komme duplikater.

Men sandsyneligheden er lille.

små bogstaver + tal & 6 tegn => 2 milliarder muligheder

små bogstaver + store bogstaver + tal & 8 tegn => 200000 millirader muligheder
Avatar billede arne_v Ekspert
15. februar 2005 - 16:30 #13
og et svar
Avatar billede radiv Nybegynder
15. februar 2005 - 16:35 #14
Nåja, mig og matematik.

Som altid, tak for god og tålmodig hjælp!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester