# Hash Wert von Passwörter erstellen (SHA)



## oetzi (22. Okt 2009)

Hallo zusammen,

hätte nicht gedacht, dass dieses Thema so kompliziert wird...
Ich suche eine Möglichkeit Passwörter zu verschlüsseln.

Habe mich erstmal durch die Theorie zur Verschlüsselung gelesen und wenn ich nicht ganz falsch liege, bietet sich SHA-265 als sichere Verschlüsselung an.

Bin dann eigentlich davon ausgegangen, dass es direkt irgendwelche Javaklassen gibt, die mir die Funktionalität der SHA-265 Verschlüsselung bietet, aber ich finde da nichts vernümpftiges.
Stoße immer wieder auf irgendwelche Quellcodes, ich will ja aber nicht die Verschlüsselung neu schreiben, sondern einfach nutzen 

Kann mir also wer helfen und nen Tipp geben, wie ich so simpel wie möglich meine Passwörter verschlüsseln kann?

Schönen Gruß
oetzi


----------



## Der Müde Joe (22. Okt 2009)

>Ich suche eine Möglichkeit Passwörter zu verschlüsseln.

generell ist das nie gut. Normalerweise verschlüsselt man kein Password sondern legt es als zb MD5 Hash ab. Für einen Login wedern dann lediglich die beiden Hashs überprüft. Muss es wirklich Ver- und wieder entschlüsselt werden ist es wurst...kannst TEA nehmen zb. (Tiny Encryption Algo).


----------



## HoaX (22. Okt 2009)

SHA ist auch keine Verschlüsselung sondern ein Hash. D.h. du kannst aus dem Hash das Passwort nicht wiederherstellen.
SHA gibts bei Java schon fertig mittels JCE.

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 26.5 Digitale Unterschriften


----------



## oetzi (23. Okt 2009)

Morgen,
also eigentlich gefällt mir die Insel ja ganz gut, aber dieses Kapitel finde ich schlecht erklärt.

Habe hier im Forum eine sehr gute Erklärung gefunden:
http://www.java-forum.org/java-faq-beitraege/16968-hashfunktionen-java-messagedigest.html

Hier mal ne kurze Zusammenfassung von mir:


```
public static void hashtest() {
        try {
            //Holen einer MessageDigest Instanz
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            
            //soll einfach ein String in einen Hash umgewandelt werden, sollte 
            //diese digest() Methode verwendet werden
            byte[] digest2 = md.digest("abd".getBytes());
            //Ausgabe des Byte Array
            for ( byte b : digest2 )
              System.out.printf( "%02x", b );
            
            System.out.println();
            
            //update kann genutzt werden, wenn man mehrere Teil(strings) hashen möchte
            //zb. wenn mehrere Eingaben hintereinander eingelesen werden und nur ein Hash erzeugt werden soll
            md.update("abd".getBytes());
            //digest() liefert die den eigentlich Hash
            byte[] digest = md.digest();
            //Ausgabe des Byte Array
            for ( byte b : digest )
              System.out.printf( "%02x", b );

           //Hashwert einem String zuweisen
           System.out.printf();
           String x = "";
            for ( byte b : digest )
                x += String.format( "%02x", b );
            System.out.println(x);

            System.out.println("__");
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(Testing_class.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
```

Eine Frage hätte ich allerdings noch.
Ich kenne diese Art der for Schleife nicht und verstehe nicht so ganz, wie genau die Ausgabe zustande kommt.

Das hier ist ja noch ersichtlich. Es wird einfach jedes Element von digest durchgegangen

```
for ( byte b : digest )
```

Aber was genau macht das denn hier??

```
System.out.printf( "%02x", b );
```


----------



## Sonecc (23. Okt 2009)

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 4.9 Formatieren von Ausgaben


----------



## oetzi (23. Okt 2009)

Man ist das kompliziert!

Verstehe ich das richtig?
digest() liefert nur Zahlenwerte, die dann noch mit diesem format Befehl in Hexadezimalschreibweise umgewandelt werden müssen?

Was ist denn jetzt der eigentlich SHA Hashwert??
Das was digest() mir liefert, oder die Hexadezimalschreibweise davon?


----------



## Der Müde Joe (23. Okt 2009)

>Was ist denn jetzt der eigentlich SHA Hashwert??

Das, was du zB bei Programmen wie md5sum siehst, wäre der Hex ;-)


----------



## oetzi (23. Okt 2009)

ähm, das ist ja jetzt nicht so ganz die Antwort auf meine Frage 
und md5sum kenne ich nicht.


----------



## Der Müde Joe (23. Okt 2009)

>ähm, das ist ja jetzt nicht so ganz die Antwort auf meine Frage

Was möchtest du hören? Die menschenleserliche Interpretation des byte-Arrays in hexadezimaler Darstellung ist die am meisten verbreitet Art einen Hash zu begutachten.

EDIT:
md5sum:
md5sum - Wikipedia, the free encyclopedia
zB:
http://mirror.switch.ch/ftp/mirror/ubuntu-cdimage/9.10/MD5SUMS


----------



## oetzi (23. Okt 2009)

> Die menschenleserliche Interpretation des byte-Arrays
Warum sollte man nen Hash "menschenleserlicher" machen?
Verstehe den Sinn dahinter immer noch nicht.

Aber vielleicht zurück zum Ausgangspunkt:
Wie speichere ich jetzt Passwörter als Hash ab? Was ist der Best Practise?
Nehme ich dazu einfach das Ergebnis, welches ich von der digest() methode bekomme?
Das umwandeln in Hex Schreibweise bietet doch keinen weiteren Sicherheitsaspekt oder?

Gruß
oetzi


----------

