Salt Erstellung verbessern

Arvid Kjaer

Mitglied
Hallo alle zusammen!

Ich habe ein Klasse, die mir Passwörter speichert. Dazu werden diese gehasht, zusammen mit einer Salt. Die Salt wird zufällig erstellt. Nun möchte ich die Salt so zufällig wie möglich erstellen. Hat jemand vielleicht eine Idee wie ich folgenden Code verbessern könnte, bzw. mir sagen, ob das ganze unsinnig ist? Danke. 🙂

Java:
 private static byte[] generateSalt() {
        byte[] salt = new byte[8];
        SecureRandom ran = new SecureRandom();
        ran.setSeed(ran.generateSeed(64));
        ran.nextBytes(salt);
        
        //Falls eine Maus vorhanden ist wird die Mausposition als weitere Zufallszahl verrechnet. 
        if (MouseInfo.getNumberOfButtons() != -1) {
            int number = 0;
            Point mousep = MouseInfo.getPointerInfo().getLocation();
            int val = ((mousep.x << 5) - mousep.x) + ((mousep.y << 5) - mousep.y);
            while (val != 0) {
                    number = number + val % 10;
                    val = val / 10;
            }
            for (int i = 0; i < salt.length; i++) {
                salt[i] = (byte) (salt[i] + number);
            }
        }
        return salt;
    }
 
Hey! Danke für deine Antwort. ;-) Allerdings ist die Umsetzung mit Java dann doch etwas schwieriger. Vielleicht weiß noch jemand, welche "Zufallsquellen" es OS-Unabhängig noch gibt, die man nutzen kann. Bildschirmauflösung vielleicht? Irgendwie tu ich mich da schwer etwas zu finden. :-/ Weiß jemand welche Quellen SecureRandom nutzt?
 
Webcams/Scanner/TvKarten, das analoge rauschen als Seed für nen RandomALgorithmus benutzen.

Oder Ram auslastung, dank zahlreicher background prozesse ist das ein ganz akzeptabler zufallsgenerator der für keine 2 pcs exact den selben seed generiert. (Ein garbagecollector basierter algoritmus ? könnte klappen da der ja auch random arbeitet.)
Oder einen int auf den 20 Threads schreibend unschyronisiert zugreifen (jeder thread hat ein muster das er verfogl, aka int = int -1; oder int = int*10/5, wenn man den nun liest ist es praktsich absolut willkürlich welchen Wert man nun erhält, da dies von caching der cpu sowei vom Thread sheduller abhängt(wo wieder die hintergrundprozesse ins spiel kommen).
 
Hm - bei diversen Usern steht die Maus häufig im Passwortfenster wenn die eines eingeben ;-) aber warum nicht.

Die Uhrzeit im mS ist auch noch zufällig wenn sie in Kombination mit Userinteraktionen genommen wird und die ist in Java sicher einfacher greifbar als das Rauschen einer TV-Karte oder des Ethernettreibers.

Natürlich nimmst du die Uhrzeit nicht als Einzelwert, aber wenn du unbedingt secure Random verbessern willst, kannst du die dazu addieren, bitweise XOR verknüpfen oder was auch immer damit machen. (Nein bitte nicht OR oder AND - das gibt eine Häufung von Einsen bzw. Nullen)

Wirklich random sind übrigens nur asynchrone Sachen - Threads die in einen int schreiben werden wohl kein wirklich zufälliges Verhalten an den Tag legen.
 
vielleicht einen Thread eine ganz schön lange Zeit was machen lassen, mindestens 0.5 sec
und dann einfach vorher und nachher die Zeit messen im Nanobereich, die letzten Stellen als Differenz dürften doch nun wirklich komplett unvorhersehbar sein

dauert natürlich ne Weile und liefert nicht unbedingt viele Stellen, falls das wichtige Punkte sind
 
Bei TrueCrypt wird zur Zufallszahlengenerierung der Benutzer gebeten, den Mauszeiger auf einem definierten Feld einige Sekunden wild hin und her zu schieben. Durch regelmäßiges Auslesen der Zeigerposition bekommt man genug zufällige Werte, mit denen man seinen Generator starten kann. Die Idee mit dem Mausposition war also schon nicht schlecht.
 
Danke an Alle für den Input. Das mit der RAM Auslastung finde ich gut und an die Uhrzeit habe ich auch nicht gedacht. :-D Das mit dem Mauszeiger ist wohl wahr, aber auch da kann sich die Position um einige Pixel unterscheiden, zumal das ganze Abhänig von der Auflösung ist. Also danke nochmal. Hilft mir alles schon viel weiter. 🙂
 

Neue Themen


Zurück
Oben