Avatar billede sigurtj Nybegynder
12. maj 2010 - 13:03 Der er 17 kommentarer og
1 løsning

MD5 Hash code

Hej.,

Vi sidder nogle drenge og skal snart aflevere vores 2.Semester eksamensopgave, og mangler lidt hjælp til vores MD5 algoritme.

- Vi skal lave et System til et hotel, og her vil vi bruge MD5 algoritme når der logges ind på systemet. Vi vil have en MD5 klasse der håndtere al koden og så inde i vores login-klasse bare oprette et objekt af MD5 klassen med et password som parameter, ala " String hashed = new MD5 (jPasswordField()); "

Vi kan simpelthen ikke få noget af den tilgængelige kode på nettet til at virke i vores program, så vi håbede at der var nogle herinde der kunne hjælpe os lidt?

Pft. :)
Avatar billede arne_v Ekspert
12. maj 2010 - 13:15 #1
Java kommer med MD5 support, så I behøver ikke nogen klasse til det.

    public static String md5(String s) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        return toHex(md.digest(s.getBytes()));
    }
    private static String toHex(byte[] ba) {
        char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < ba.length; i++) {
          sb.append(hexdigit[(ba[i] >> 4) & 0x0F]);
          sb.append(hexdigit[ba[i] & 0x0F]);
        }
        return sb.toString();
    }

kaldes som md5(jeresstring)
Avatar billede sigurtj Nybegynder
12. maj 2010 - 13:23 #2
Det er mere fordi at vores lærer siger at vi skal have så lidt kode på vores knapper som muligt, og derfor lave en klasse til det og så bare oprette et objekt af det :)?
Avatar billede arne_v Ekspert
12. maj 2010 - 13:26 #3
Så put de to metoder i en klasse og lad constructor tage input string og en toString metode returnere output string.

Men det er ikke pænt design.
Avatar billede sigurtj Nybegynder
12. maj 2010 - 13:35 #4
public class MD5{
       
        public MD5 (String pass){
           
        }
       
        public static String md5(String s) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        return toHex(md.digest(s.getBytes()));
        }
        private static String toHex(byte[] ba) {
        char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < ba.length; i++) {
          sb.append(hexdigit[(ba[i] >> 4) & 0x0F]);
          sb.append(hexdigit[ba[i] & 0x0F]);
        }
        return sb.toString();
    }
}


- Hvad skal der ind i den Constructor så?
Avatar billede sigurtj Nybegynder
12. maj 2010 - 13:40 #5
Der er vidst nogle problemer med at jPasswordField.getPassword() tager en String, men at MD5 hashen går ud fra char[] ?
Avatar billede arne_v Ekspert
12. maj 2010 - 13:41 #6
private String md5val;
      public MD5 (String pass){
            md5val = md5(pass);         
        }
...
      public String toString() {
          return md5val;
      }
Avatar billede arne_v Ekspert
12. maj 2010 - 13:41 #7
Men jeg kan stadig ikke se hvad problemet er med:

noget = MD5class.md5(pass);
Avatar billede sigurtj Nybegynder
12. maj 2010 - 13:46 #8
Men det løser jo ikke problemet med at jPasswordField.getPassword() tager char[] og min MD5 constructor tager en String?
Avatar billede arne_v Ekspert
12. maj 2010 - 13:47 #9
Det er nemt at konvertere mellem String og char[].
Avatar billede sigurtj Nybegynder
12. maj 2010 - 13:51 #10
Kan ikke rigtig se hvad der skal til for at konvertere min jPasswordField til String?
Avatar billede arne_v Ekspert
12. maj 2010 - 13:54 #11
new String(jPasswordField.getPassword())
Avatar billede sigurtj Nybegynder
12. maj 2010 - 14:00 #12
Ja det er da klart :)

Så nu ser min MD5 klasse således ud:

public class MD5{

      private String md5val;
     
      public MD5 (String pass) throws NoSuchAlgorithmException{
            md5val = md5(pass);     
        }

        public static String md5(String s) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        return toHex(md.digest(s.getBytes()));
        }
        private static String toHex(byte[] ba) {
        char hexdigit[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < ba.length; i++) {
          sb.append(hexdigit[(ba[i] >> 4) & 0x0F]);
          sb.append(hexdigit[ba[i] & 0x0F]);
        }
        return sb.toString();
    }
    @Override
          public String toString() {
          return md5val;
      }
}

Inde i min Login klasse kalder jeg så:

MD5 hashed = new MD5(new String(jPasswordField1.getPassword()));

Så nu er min "hashed" mit jPasswordField min hashede String?
Avatar billede sigurtj Nybegynder
12. maj 2010 - 14:09 #13
Men min MD5 Constructor skal vel være Sting? Altså,

public String MD5 (String pass) - fordi jeg skal vel kalde den sådan i min Login-klasse?

String hashed = new MD5( new String ( jPasswordField.getPassword()));
Avatar billede arne_v Ekspert
12. maj 2010 - 14:33 #14
String hashed = (new MD5( new String ( jPasswordField.getPassword()))).toString();

eller:

String hashed = "" + new MD5( new String ( jPasswordField.getPassword()));
Avatar billede sigurtj Nybegynder
15. maj 2010 - 15:01 #15
I din første kommentar du skrev.

- Hvordan gemmer jeg den så jeg kan sammenligne med en String i databasen? - Altså, md5(new String (jPasswordField1.getPassword()) gemmer den jo ikke nogen steder?
Avatar billede arne_v Ekspert
15. maj 2010 - 15:41 #16
String hashval = md5(whatever);
Avatar billede sigurtj Nybegynder
15. maj 2010 - 17:10 #17
Ja, tror vi er ved at have meget godt styr på det, mange tak for hjælpen :)

Hvordan overgiver jeg de points til dig?
Avatar billede arne_v Ekspert
15. maj 2010 - 17:17 #18
Jeg smider et svar som du kan acceptere.
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