JRE-/JDK-unabhängige PBKDF2WithHmacSHA512-Implementierung

ruutaiokwu

Top Contributor
Hallo zusammen

De facto scheint's das praktisch nicht zu geben... ALLES, ABER WIRKLICH ALLES, wonach man sucht ist letztendliche nichts anderes als ein Proxy / eine Abstraktion - z.B. com.github.ivangolubev.pbkdf2sha512, Apache Commons Codec, Guava, whatever...

FRAGE: Kenne jemand von euch ne Library, welche das PBKDF2WithHmacSHA512-Verfahren im Griff hat aber in KEINSTER WEISE (!!) von irgendwelchen Klassen java.xxx..., javax.www..., com.sun etc. pp. abhängig ist...?

Es geht um einen älteren Java-Quelltext, der weiterhin mit dem älteren JRE laufen muss nun aber um PBKDF2WithHmacSHA512 erweitert werden soll.

Besten Dank für die Feedbacks. :)
 

ruutaiokwu

Top Contributor
Also sowas hier - aber komplett JRE-unabhängig - unabhängig von java.xxx..., javax.www..., com.sun etc. pp.

Java:
import java.security.SecureRandom;

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

...
...
...

class ...

public static String pbkdf2Encode(final String rawPassword, final byte[] salt, final int numberOfIterations) {
        try {
            final PBEKeySpec spec = new PBEKeySpec(rawPassword.toCharArray(), salt, numberOfIterations, 512);
            final SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
            return Base64.encodeBase64String(skf.generateSecret(spec).getEncoded());
        } catch (final Exception ex) {
            throw new RuntimeException(ex);
        }
    }
 

ruutaiokwu

Top Contributor
Danke für dein Feedback.

"Soweit ich das sehe, gibt es da Implementierung bis zurück zum JDK 1.2 - das sollte mit einem alten JRE laufen."


Ich denke, "PBKDF2WithHmacSHA512" geht wohl eher (??) weniger bis ins Jahr 1998 zurück; kann aber auch sein, dass ich mich täusche. Hätte gemeint, dieser String als Parameter der Factory-Methode SecretKeyFactory.getInstance(...) wäre erst unterstützt ab Java 1.8?

Wie dem auch sei - da ich u.A. auch vor habe, das Programm nach .NET zu konvertieren (-> nach IKVM.NET googeln...) und es dann unter Debian Linux 11.0 mithilfe der Laufzeitumgebung "mono-complete" [Paket-Name] laufen zu lassen musste ich mit den Versionen etwas zurückfahren... Unter Eclipse habe ich gar Java 1.7 eingestellt, IKVM wandelt .jar [.class]-Dateien nach .NET 2.0 um (aktuelle Versionen / Forks von IKVM.NET ggf. höher?) und das Paket "mono-complete" unterstützt bei Debian auch nicht die aktuellsten .NET-Versionen.

(BTW. hab ich noch das Original .NET FW von M$ versucht auf Debian zu installieren, unterstützt Core 3.1 sowie 6.0 - ich denke, 6.0 sollte abwärtskompatibel sein zu den von IKVM.NET generierten v2.0-Executables... die Ausführung über "./myDotNetExecutable.exe", natürlich vorher mit "chmod +x myDotNetExecutable.exe" als "executable" geflaggt, geht beim Original-M$-Framework für Linux nicht einfach so... ich las was vom Paket "dotnet-host", aber aber auch nix gebracht... ggf. weiss ja jemand weiteres zum Thema (?))

So hab ich's gemacht, mit ein paar externen Libraries, welche noch zu älteren Versionen als 1.7 kompatibel sind... so wird das ganze Zeugs wohl gar Android-kompatibel sein - falls es eines Tages sein muss, wer weiss... ;-)
Java:
import org.apache.commons.codec.binary.Base64;

public class MosquittoUsrAcctGen {

    private MosquittoUsrAcctGen(final String[] caArgs) throws Exception {
        super();

        if (caArgs.length < 2) {
            System.out.println("No arguments set - please use as follows: MosquittoUsrAcctGen [username] [password]");
            return;
        }

        /*
        System.out.println("User: \r\n" + caArgs[0]);
        System.out.println();
        System.out.println("Password: \r\n" + caArgs[1]);
        System.out.println();
        */

        this.start(caArgs[0].trim(), caArgs[1].trim());
    }

    private void start(final String caUsername, final String caPassword) throws Exception {

        final byte[] clRandomSaltByteArr = MyLibrary.generateRandomSalt(12);
        final int numberOfIterations = 31000;
        final String clSaltedPasswordHashAsBase64EncodedString = MyLibrary.pbkdf2Encode(caPassword, clRandomSaltByteArr,
                numberOfIterations);
        final String clRandomSaltAsBase64EncodedString = Base64.encodeBase64String(clRandomSaltByteArr);
        final String clMosquittoUsernameAndPasswordValuePair = caUsername + ":$7$" + numberOfIterations + "$"
                + clRandomSaltAsBase64EncodedString + "$" + clSaltedPasswordHashAsBase64EncodedString;
        System.out.println(clMosquittoUsernameAndPasswordValuePair);
    }

    public static void main(String[] caArgs) throws Exception {
        if (caArgs == null) {
            caArgs = new String[0];
        }

        new MosquittoUsrAcctGen(caArgs);
    }
}
Code:
import java.security.SecureRandom;
import java.security.Security;

import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.crypto.PBEParametersGenerator;
import org.bouncycastle.crypto.digests.SHA512Digest;
import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public abstract class MyLibrary {

    private MyLibrary() {
        super();
    }

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    public static byte[] generateRandomSalt(final int caNumberOfBytes) {
        final byte[] lNonce = new byte[caNumberOfBytes];
        new SecureRandom().nextBytes(lNonce);
        final StringBuilder clResult = new StringBuilder();

        for (final byte temp : lNonce) {
            clResult.append(Integer.toHexString(temp));
        }

        byte[] lReturn = null;
        String str = clResult.toString();
        str = str.substring(0, caNumberOfBytes);
        lReturn = str.getBytes();
        return lReturn;
    }

    public static String pbkdf2Encode(final String rawPassword, final byte[] salt, final int numberOfIterations) {
        try {
            String ret = null;
            PBEParametersGenerator generator = new PKCS5S2ParametersGenerator(new SHA512Digest());
            generator.init(rawPassword.getBytes(), salt, numberOfIterations);
            KeyParameter params = (KeyParameter) generator.generateDerivedMacParameters(512);
            ret = Base64.encodeBase64String(params.getKey());
            return ret;
        } catch (final Exception ex) {
            throw new RuntimeException(ex);
        }
    }
}


-> Mit Linux, IKVM.NET und "mono-complete" geht aber auch das hier nicht:
static {
Security.addProvider(new BouncyCastleProvider());
}
...
...
...
SecretKeyFactory.getInstance("PBEWITHHMACSHA1", "BC");


Unter https://stackoverflow.com/questions/8674018/pbkdf2-with-bouncycastle-in-java wären die 3 Verfahren beschrieben: 1.) Java Framework (JRE) mit der SecretKeyFactory.getInstance(...)-Factory, dann 2.) die Bountycastle-Variante welche nicht als SecretKeyFactory.getInstance(...)-Factory implementiert ist und 3.) die Bountycastle-Variante welche als SecretKeyFactory.getInstance(...)-Factory implementiert ist.

(Der von mir verwendete Code für HMAC-SHA512 ist aber nicht von dort)

Libraries:

usJ6xak.jpeg


(Die unteren beiden sind sekundär...)

Resultat:

l7fEl0y.jpg


:)
 
Y

yfons123

Gast
du brauchst kein mono-complete mehr
einfach
sudo apt install dotnet6
gibts seit ein paar tage und ist einfacher zu installieren
es gibt auch noch einen langen package namen .. ka was da der unterschied ist
sudo apt install dotnet-sdk-6.0

falls du es selber machen möchtest
hier den 5er durch 6 erzeugen

das kannst du auch auf DOS zum laufen bringen oder windows 3.11
 

ruutaiokwu

Top Contributor
Also "chmod +x dateiname.exe" und dann "./dateiname.exe" (Ausführen wie jede gewöhnliche Linux-Executable) hat nach der Installation vom Original-M$-Framework (installiert gem. offiz. Installationsanleitung, aber ohne ASP.NET) irgendwie nicht mehr (wie bei mono(-complete)) geklappt.

Keine Ahnung, evtl. hab ich auch was übersehen, kann dann morgen noch mal schauen ob's auch damit irgendwie läuft. (?) Auch wenn die Dateien, welche man mit IKVM.NET generieren kann, kleiner sind als .NET v6.0 sind, so sollte v6.0, oder v5.0 (...) ja abwärtskompatibel sein. (Solange es nicht die "Core-Version" ist sollte es gehen würde ich sagen; denn dort ist ja einiges ganz anders. Die würde es in v3.1 geben für Debian...)

"das kannst du auch auf DOS zum laufen bringen oder windows 3.11"

ZU GEIL, made may day... 😁 DOS 5.0 hätte ich noch originalverpackt, 3 Disketten, aber die öffne ich nicht ;-) Win 3.11 könnte man sicher auch irgendwo herunterladen... dann das Zeugs unter VirtualBox zum laufen bringen. (Wenn das bei den heutigen 64Bit-CPUs überhaupt 16 Bit kann, sonst halt QEMU...)
 

ruutaiokwu

Top Contributor
Eigentlich schon, why not? Eigentlich mag ich ja solche "trockenen", mathematischen Sachen, Algorithmen - eher weniger Netzwerk- und GUI-Themen.

Habe nach dem Algorithmus geschaut, eine theor. Definition (aus der Sicht von Mathematikern oder theor. Informatikern) fand ich auf die Schnelle nicht. Und ganz ehrlich wär ich wohl ein wenig überfordert, diese korrekt zu interpretieren. (Mit all diesen Zeichen...)

Und ein Beispiel in einer anderen Sprache welche ich einigermassen verstehe (PHP, C#, C/C++ ... ) um das nach Java zu übersetzen fand ich ebenfalls nicht sofort.

Aber diese BountyCastle-Library ist ganz nett, die hat auch ne gute Kompatibilität (gibt versch. Jars zum Download) von Java 1.5 bis 1.8 :) und läuft damit - wie schon erwähnt - wohl gar mit Android problemlos... :)
 

mihe7

Top Contributor
Das dürfte gar nicht mal so schwer sein. Der Algorithmus von SHA-512 lässt sich quasi 1:1 aus RFC 6234 übernehmen, HMAC ist poplig (im Endeffekt XORen) und PBKDF2 (RFC 2898) scheint mir jetzt auch keinen riesigen Implementierungsaufwand darzustellen.
 

ruutaiokwu

Top Contributor
Eigentlich schon, why not? Eigentlich mag ich ja solche "trockenen", mathematischen Sachen, Algorithmen - eher weniger Netzwerk- und GUI-Themen.

Habe nach dem Algorithmus geschaut, eine theor. Definition (aus der Sicht von Mathematikern oder theor. Informatikern) fand ich auf die Schnelle nicht. Und ganz ehrlich wär ich wohl ein wenig überfordert, diese korrekt zu interpretieren. (Mit all diesen Zeichen...)

Und ein Beispiel in einer anderen Sprache welche ich einigermassen verstehe (PHP, C#, C/C++ ... ) um das nach Java zu übersetzen fand ich ebenfalls nicht auf die Schnelle.

Aber diese BountyCastle-Library ist ganz nett, die hat auch ne gute Kompatibilität (gibt versch. Jars zum Download) von Java 1.5 bis 1.8 :) und läuft damit - wie schon erwähnt - wohl gar mit Android problemlos... :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Interface 2 von einander unabhängige Frames mit Panel gleichzeitig nutzen Java Basics - Anfänger-Themen 66
D Plattform unabhängige System-variablen Java Basics - Anfänger-Themen 3
M OS unabhängige Visualisierung einer Steuerung Java Basics - Anfänger-Themen 12
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
K Fehler bei der Implementierung Java Basics - Anfänger-Themen 6
J Implementierung gcd();square() Java Basics - Anfänger-Themen 98
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
A Implementierung von String toString methode() Java Basics - Anfänger-Themen 4
G Projekt architektur (implementierung) Java Basics - Anfänger-Themen 3
M Implementierung einer getNextId Methode Java Basics - Anfänger-Themen 5
J Implementierung Listen-ADT Java Basics - Anfänger-Themen 131
J Implementierung eines Zustandsdiagramms Java Basics - Anfänger-Themen 19
I GenericQueue / Implementierung als Ringspeicher Java Basics - Anfänger-Themen 4
MiMa Log4j2 implementierung Java Basics - Anfänger-Themen 4
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
G Array implementierung Java Basics - Anfänger-Themen 23
J ANTLR Installierung und Implementierung Java Basics - Anfänger-Themen 2
E Hilfe bei Implementierung von Methoden Java Basics - Anfänger-Themen 10
S SkipList Implementierung Java Basics - Anfänger-Themen 1
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
E hashCode implementierung Java Basics - Anfänger-Themen 9
S Implementierung der Klasse Konto und Nutzung bereits vorhandener Klassen Java Basics - Anfänger-Themen 7
H Implementierung eines Interfaces erweitern Java Basics - Anfänger-Themen 13
O Generics - Implementierung Java Basics - Anfänger-Themen 7
A Hilfestellung zur Implementierung des Gaußsches Eliminationsverfahren Java Basics - Anfänger-Themen 4
B OOP Implementierung eines Heaps Java Basics - Anfänger-Themen 13
K Bucketsort Implementierung Java Basics - Anfänger-Themen 0
K Mergesort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
K Quicksort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
S Klassen Klassendiagramm Implementierung? Java Basics - Anfänger-Themen 5
J Bucketsort Implementierung Java Basics - Anfänger-Themen 0
C Stack - listenbasierte Implementierung Java Basics - Anfänger-Themen 4
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
T Collections LinkedList<LinkedList<T>> - Implementierung Java Basics - Anfänger-Themen 10
F Implementierung von Interfaces -> Problem mit main Java Basics - Anfänger-Themen 12
D Resourcebundle implementierung Java Basics - Anfänger-Themen 2
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
Q Implementierung von Listenern Java Basics - Anfänger-Themen 4
B Klassen Hilfe bei Implementierung Java Basics - Anfänger-Themen 5
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Binärbaums Java Basics - Anfänger-Themen 3
I Erste Schritte Implementierung der API Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Adressbuches Java Basics - Anfänger-Themen 20
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
G Implementierung eines Kontos Java Basics - Anfänger-Themen 11
M Quicksort implementierung Java Basics - Anfänger-Themen 23
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
U Doppelte Interfcae Implementierung Java Basics - Anfänger-Themen 10
K Kleiner Fehler bei Methoden Implementierung Java Basics - Anfänger-Themen 6
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
S OOP Implementierung Komposition, Aggregation, Assoziation und Generalisierung Java Basics - Anfänger-Themen 2
C Klassenhirarchien zur Implementierung von Fahrzegen Java Basics - Anfänger-Themen 26
BinaryLogic Datentypen Statistik Interface - untersch. Implementierung Java Basics - Anfänger-Themen 5
E Performante Implementierung eines "Hintergrundprogramms" Java Basics - Anfänger-Themen 10
S Saubere Implementierung Java Basics - Anfänger-Themen 2
K Dijkstra implementierung 2.0 Java Basics - Anfänger-Themen 19
K dijskral implementierung Java Basics - Anfänger-Themen 14
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
K Game of Life Implementierung Java Basics - Anfänger-Themen 30
B OOP Problem bei Implementierung von Interface Java Basics - Anfänger-Themen 6
J HashSet Implementierung Java Basics - Anfänger-Themen 16
R NullPointerException in Queue-Implementierung Java Basics - Anfänger-Themen 11
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
B Effektive Implementierung für Darstellung großer Datenmengen in Jogl Java Basics - Anfänger-Themen 5
D Datentypen Implementierung eines Binärbaumes Java Basics - Anfänger-Themen 7
B Implementierung Java Basics - Anfänger-Themen 2
N Implementierung Tic tac toc Java Basics - Anfänger-Themen 25
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
Y Implementierung einer Potenzturm Funktion Java Basics - Anfänger-Themen 4
S Implementierung gegen Interfaces / List, ArrayList, LinkedList Java Basics - Anfänger-Themen 11
J Quicksort Implementierung-- Exception ArrayOutOfBounds Java Basics - Anfänger-Themen 6
U Implementierung Constructor Java Basics - Anfänger-Themen 7
T Problem mit Implementierung von einer HashMap aufgabe Java Basics - Anfänger-Themen 2
G Implementierung des Observer/Observable Patterns - Gut so? Java Basics - Anfänger-Themen 3
I Zugriff auf Implementierung verhindern Java Basics - Anfänger-Themen 8
D Implementierung nach MVC Java Basics - Anfänger-Themen 6
B Theoretische Frage zum Programmbau (nun zur Implementierung) Java Basics - Anfänger-Themen 8
H Implementierung von Interfaces Java Basics - Anfänger-Themen 4
G Implementierung von Bäumen Java Basics - Anfänger-Themen 2
N Probleme mit paint() bei Implementierung in ein Panel Java Basics - Anfänger-Themen 4
B Wie funktioniert die implementierung von c code in Java? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben