[JAVA] Übersetzungs/Verständnis-Schwierigkeiten SignUrl

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    [JAVA] Übersetzungs/Verständnis-Schwierigkeiten SignUrl

    Hallo Leute, ich habe folgende in Java geschriebene Funktion
    und möchte diese in VB.net übersetzen:


    Java-Quellcode

    1. public class URLSigner {
    2. private static final String SECRET = "11111111111";
    3. public static String getSignedUrl(String str) {
    4. if (str == null) {
    5. return null;
    6. }
    7. String stringBuilder;
    8. StringBuilder stringBuilder2 = new StringBuilder(str);
    9. stringBuilder2.append("?a=");
    10. stringBuilder2.append(Long.toString((new Date().getTime() / 1000) + 99000));
    11. try {
    12. MessageDigest instance = MessageDigest.getInstance("MD5");
    13. instance.update(SECRET.getBytes());
    14. instance.update(stringBuilder2.toString().getBytes());
    15. String bigInteger = new BigInteger(1, instance.digest()).toString(16);
    16. stringBuilder2.append("&b=");
    17. for (int length = 32 - bigInteger.length(); length > 0; length--) {
    18. stringBuilder2.append('0');
    19. }
    20. stringBuilder2.append(bigInteger);
    21. stringBuilder = stringBuilder2.toString();
    22. } catch (NoSuchAlgorithmException e) {
    23. stringBuilder = null;
    24. }
    25. return stringBuilder;
    26. }
    27. }

    Eingegeben wird in die Funktion ein Link wie zum Beispiel test.de/files/bild.jpg,
    die Funktion fügt nur die Werte a= und b= hinzu und da drückt bei mir der Schuh.

    Bis Zeile 11. wird nach meinem Java Verständnis ein Timestamp erstellt welcher
    durch 1000 geteilt wird und mit 99000 addiert wird.

    Ab Zeile 13. wird dann eine Klasse erstellt so ähnlich wie in .Net die Klasse MD5CryptoServiceProvider
    diese läd als erstes das Secret und in Zeile 14. dann den Input-Link sowie den Wert a=.

    Und dann ab Zeile 17. steige ich leider aus, dann wird eine Art Variable erstellt names BigInteger
    die von 1 bis zu instance.digest()).toString(16) gehen soll.

    Lange rede kurzer Sinn, ich benötige eure Hilfe um den Code zu verstehen ab Zeile 17.
    ich denke für jemanden der Java kann ist das ein leichtes das Snipped hat ja nur ein paar Zeilen.

    best regards

    *Topic verschoben, Code-Tag verbessert*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hier passiert folgendes:

    Quellcode

    1. Baue String s zusammen: s = [str] + "?a=" + [Unix-Zeit + 99000]
    2. Implizit: Führe die Byte-Arrays von [SECRET] und [s] zusammen (via instance.update())
    3. Berechne x = MD5(Bytes([SECRET] + [s]))
    4. Erzeuge hash = Stringdarstellung von x zur Basis 16 (der bekannte MD5-Hash, 32 Hexadezimalziffern zur Darstellung von 16 Bytes)
    5. Füge zu s hinzu: s += "&b="
    6. Berechne c = Anzahl Zeichen in hash
    7. Füge zu s hinzu: s += [(32-c)-mal '0'] + hash
    8. Gib s zurück.

    Oder kurz:

    Quellcode

    1. s = [str] + "?a=" + [Unix-Zeit + 99000]
    2. return s + "&b=" + ZeroPad(32, MD5(Bytes(SECRET + s)))

    Gruß
    hal2000

    VB.NET-Quellcode

    1. Function SignUrl(ByRef StrUrl As String) As String
    2. Dim stringSecret = "11111111111"
    3. Dim stringOutput = StrUrl & "?a=" & Convert.ToString(GetTimestamp() + 99000)
    4. stringOutput &= "&b=" & GetHash((stringSecret & stringOutput)).ToString
    5. return stringOutput
    6. End Function
    7. Function GetHash(strToHash As String) As String
    8. Dim md5Obj As New System.Security.Cryptography.MD5CryptoServiceProvider
    9. Dim bytesToHash() As Byte = System.Text.Encoding.ASCII.GetBytes(strToHash)
    10. bytesToHash = md5Obj.ComputeHash(bytesToHash)
    11. Dim strResult = ""
    12. For Each b As Byte In bytesToHash
    13. strResult &= (b.ToString("x2"))
    14. Next
    15. Return strResult.ToString
    16. End Function
    17. Function GetTimestamp() As Long
    18. Return DateDiff("s", "01.01.1970", DateTime.Now)
    19. End Function


    ^^Würde ich jetzt so in VB.net umsetzen,
    oder habe ich etwas falsch bemessen.

    best regards
    Funktioniert leider nicht, liegt wohl ehrlich an meinem Java Verständnis.

    Java-Quellcode

    1. String bigInteger = new BigInteger(1, instance.digest()).toString(16);
    2. stringBuilder2.append("&b=");
    3. for (int length = 32 - bigInteger.length(); length > 0; length--) {
    4. stringBuilder2.append('0');
    5. }
    6. stringBuilder2.append(bigInteger);


    Präzisiere bitte einmal was diese BigInteger Variable beinhaltet,
    ist das die 1 ein Startindex? Dann kann instance.digest()).toString(16) aber kein Endindex sein!?

    Die Schleife die folgt füllt Nullen auf, bevor der bigInteger angefügt wird
    doch was genau steht in dem BigInteger?

    Oder Besser gesagt in deinem ersten Post erläuterst du alles in der Zeile 6-7,
    aber kannst du das irgendwie an einem Beispiel erklären?

    best regards
    Die 1 ist das Vorzeichen (hier 1, also Plus / positiver Wert / kein Vorzeichen); siehe docs.oracle.com/javase/7/docs/…l#BigInteger(int, byte[])

    Der BigInteger enthält die Zahl, die entsteht, wenn man die hexadezimale Darstellung des Hashwerts in BigEndian-Reihenfolge (d.h. wie gelesen, nicht getauscht) zur Basis 16 interpretiert. Für den Hash 128ecf542a35ac5270a87dc740918404 wäre das die Zahl 24667615205057295578223984981434270724. Die erste Darstellung (den Hash) gibt es jedoch noch nicht, weil er als Byte-Array angeliefert wird. Der BigInteger erledigt die Konvertierung über den Umweg der Zahl.
    Gruß
    hal2000