StringExplode in VB.net?

Hi ich hab eine Webseite dessen login ich nutzen will.
Die Seite läuft über ein CMS .

das CMS (Joomla) erstellt neben einen MD5 einen Salt und macht dann einen Stringexplode.

nun möchte ich aber die Daten auch für ein Programm zum login nutzen.

Also muss ich nachdem ich den MD5 generiert habe und den Salt angehängt habe , den Explode den PHP bei Strings machen kann auch via VB.Net durchführen.


Meine Frage ist also nun :

Wie muss meine Explode-Funktion aufgebaut sein um dies zu tuen? hab keinerlei idee.


Auf der Seite hatte jemand eine JAVA-Syntax gepostet die dies bewerkstelligen könnte.

allerdings kann ich kein JAVA somit könnte ich es mir selbst nicht in VB.NET übersetzen.

Naja ... die Syntax die gepostet wurde war jedenfalls :

Code:
public class Joomla15PasswordHash
{
   public static boolean check(String passwd,String dbEntry) {
      if (passwd==null || dbEntry==null || dbEntry.length()==0)
    throw new IllegalArgumentException();
      String[] arr = dbEntry.split(":",2);
      if (arr.length==2) {
    // new format as {HASH}:{SALT}
    String cryptpass = arr[0];
    String salt = arr[1];
   
    return md5(passwd+salt).equals(cryptpass);
      } else {
         // old format as {HASH} just like PHPbb and many other apps
    String cryptpass = dbEntry;
     
    return md5(passwd).equals(cryptpass);
      }
   }

   static Random _rnd;

   public static String create(String passwd) {
      StringBuffer saltBuf = new StringBuffer();
      synchronized (Joomla15PasswordHash.class) {
    if (_rnd==null) _rnd=new SecureRandom();
    int i;
    for (i=0;i<32;i++) {
       saltBuf.append(Integer.toString(_rnd.nextInt(36),36));
    }
      }
      String salt = saltBuf.toString();

      return md5(passwd+salt)+":"+salt;
   }

   /** Takes the MD5 hash of a sequence of ASCII or LATIN1 characters,
    *  and returns it as a 32-character lowercase hex string.
    *
    *  Equivalent to MySQL's MD5() function
    *  and to perl's Digest::MD5::md5_hex(),
    *  and to PHP's md5().
    *
    *  Does no error-checking of the input,  but only uses the low 8 bits
    *  from each input character.
    */
   private static String md5(String data) {
      byte[] bdata = new byte[data.length()]; int i; byte[] hash;

      for (i=0;i<data.length();i++) bdata[i]=(byte)(data.charAt(i)&0xff );

      try {
         MessageDigest md5er = MessageDigest.getInstance("MD5");
         hash = md5er.digest(bdata);
      } catch (GeneralSecurityException e) { throw new RuntimeException(e); }

      StringBuffer r = new StringBuffer(32);
      for (i=0;i<hash.length;i++) {
         String x = Integer.toHexString(hash[i]&0xff);
         if (x.length()<2) r.append("0");
         r.append(x);
      }
      return r.toString();     
   }
}
 
Zuletzt bearbeitet:
Ich hab den Code mal für dich Übersetzt und Kommentiert. Der Aufbau ist folgender:
1. Datenbankeintrag an den Doppelpunkten splitten. Wobei hier 2 Teile genügen. (Datenbankeintrag ist im Format GehashtesPasswort:Salt).
2. Der Salt wird dann an das zu überprüfende Passwort angehängt und mit dem MD5 Algorithmus gehashet.
3. Zum Schluss werden die zwei MD5-Strings miteinander verglichen um das Passwort zu validieren.

Um den String MD5 zu verschlüsseln wird die Klasse System.Security.Cryptography.MD5CryptoServiceProvider verwendet welche von den Bytes des Strings den Hash berechnet. Über die ToString Methode werden dann die Bytes wieder in einen String umgewandelt.
Visual Basic:
' Imports:
using System;
using System.Text;
using System.Security.Cryptography;

''' <summary>
''' Eine Helferklasse welche Methoden zur Verfügung stellt um Passwörter
''' von Joomla zu überprüfen.
''' </summary>
Public Class Joomla15PasswordHash
    ''' <summary>
    ''' Überprüft ob das angegebene Passwort für den Datenbankeintrag 
    ''' übereinstimmt.
    ''' </summary>
    ''' <param name="sPassword">Das Passwort in Klartext welches validiert werden soll.</param>
    ''' <param name="sDbEntry">
    ''' Der Datenbankeintrag welcher das Originalpasswort im Format
    ''' VerschluesseltesPasswort:Salt beinhaltet.
    ''' </param>
    ''' <returns>true wenn das angegebene Passwort mit dem Passwort des Datenbankeintrags übereinstimmt.</returns>
    Public Shared Function CheckJoomlaPassword(ByVal sPassword As String, ByVal sDbEntry As String) As Boolean
        ' Ungültige Argumente?
        If String.IsNullOrEmpty(sPassword) Then
            Throw New ArgumentNullException("sPassword")
        End If
        If String.IsNullOrEmpty(sDbEntry) Then
            Throw New ArgumentNullException("sDbEntry")
        End If
        ' Datenbankeintrag splitten (Nur 2 Teile)
        ' Md5Pass:Salt wird zu:
        ' [0] --> Md5Pass
        ' [1] --> Salt
        Dim asDbParts As String() = sDbEntry.Split(New Char() {":"C}, 2)
        Dim sHashedPass As String
        ' Wirklich 2 Elemente im Array?
        If asDbParts.Length = 2 Then
            ' Salt und Passwort zusammenfügen
            Dim sCombinedPassword As String = asDbParts(0) + asDbParts(1)
            ' Passwort hashen
            sHashedPass = CalculateMD5Hash(sCombinedPassword)
        Else
            ' Kein Salt
            ' Ohne Salt einfach ganzen Eintrag hashen
            sHashedPass = CalculateMD5Hash(sDbEntry)
        End If
        ' Übereinstimmung zurückgeben
        Return sPassword.Equals(sHashedPass, StringComparison.CurrentCultureIgnoreCase)
    End Function
    
    ''' <summary>
    ''' Berechnet einen MD5 Hash des angegebenen Strings.
    ''' </summary>
    ''' <param name="sToHash">Der String welcher gehasht werden soll. </param>
    ''' <returns>Einen 32 Zeichen langen Hex String welcher der MD5 Hash 
    ''' des angegebenen Strings entspricht.</returns>
    Private Shared Function CalculateMD5Hash(ByVal sToHash As String) As String
        ' Einen MD5 Hasher Erstellen
        Dim oMd5Hasher As New MD5CryptoServiceProvider()
        ' Bytes des Strings holen
        Dim axStringBytes As Byte() = Encoding.ASCII.GetBytes(sToHash)
        ' Hash der Bytes berechnen
        axStringBytes = oMd5Hasher.ComputeHash(axStringBytes)
        ' Die Bytes in einen Md5 String umwandeln
        Dim sMd5String As String = ""
        For i As Integer = 0 To axStringBytes.Length - 1
            sMd5String += axStringBytes(i).ToString("x2").ToLower()
        Next
        Return sMd5String
    End Function
End Class

Ich hoffe ich konnte dir helfen und du hast was dabei gelernt :).
Gruß Daniel
 
Vielen Dank für die Hilfe . ^^

Die Funktion liefert mir leider immer einen False zurück =I

naja vlt. stimmt auch was an meiner Vorgehensweise nicht .

Musste ein wenig umschreiben weil das Visual Studio Express 2008 anscheinend ein Problem mit den Using hat ( warum auch immer )

Naja mein jetziger Code lautet :

Code:
' Imports:
'using System;
'using System.Text;
'using System.Security.Cryptography;

''' <summary>
''' Eine Helferklasse welche Methoden zur Verfügung stellt um Passwörter
''' von Joomla zu überprüfen.
''' </summary>
Public Class userlist
    ''' <summary>
    ''' Überprüft ob das angegebene Passwort für den Datenbankeintrag 
    ''' übereinstimmt.
    ''' </summary>
    ''' <param name="sPassword">Das Passwort in Klartext welches validiert werden soll.</param>
    ''' <param name="sDbEntry">
    ''' Der Datenbankeintrag welcher das Originalpasswort im Format
    ''' VerschluesseltesPasswort:Salt beinhaltet.
    ''' </param>
    ''' <returns>true wenn das angegebene Passwort mit dem Passwort des Datenbankeintrags übereinstimmt.</returns>
    ''' 

    Public Shared Function CheckJoomlaPassword(ByVal sPassword As String, ByVal sDbEntry As String) As Boolean
        ' Ungültige Argumente?
        If String.IsNullOrEmpty(sPassword) Then
            Throw New ArgumentNullException("sPassword")
        End If
        If String.IsNullOrEmpty(sDbEntry) Then
            Throw New ArgumentNullException("sDbEntry")
        End If
        ' Datenbankeintrag splitten (Nur 2 Teile)
        ' Md5Pass:Salt wird zu:
        ' [0] --> Md5Pass
        ' [1] --> Salt
        Dim asDbParts As String() = sDbEntry.Split(New Char() {":"c}, 2)
        Dim sHashedPass As String
        ' Wirklich 2 Elemente im Array?
        If asDbParts.Length = 2 Then
            ' Salt und Passwort zusammenfügen
            Dim sCombinedPassword As String = asDbParts(0) + asDbParts(1)
            ' Passwort hashen
            sHashedPass = CalculateMD5Hash(sCombinedPassword)
        Else
            ' Kein Salt
            ' Ohne Salt einfach ganzen Eintrag hashen
            sHashedPass = CalculateMD5Hash(sDbEntry)
        End If
        ' Übereinstimmung zurückgeben
        Return sPassword.Equals(sHashedPass, StringComparison.CurrentCultureIgnoreCase)
    End Function

    ''' <summary>
    ''' Berechnet einen MD5 Hash des angegebenen Strings.
    ''' </summary>
    ''' <param name="sToHash">Der String welcher gehasht werden soll. </param>
    ''' <returns>Einen 32 Zeichen langen Hex String welcher der MD5 Hash 
    ''' des angegebenen Strings entspricht.</returns>
    Private Shared Function CalculateMD5Hash(ByVal sToHash As String) As String
        ' Einen MD5 Hasher Erstellen
        Dim oMd5Hasher As New System.Security.Cryptography.MD5CryptoServiceProvider()
        ' Bytes des Strings holen
        Dim axStringBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(sToHash)
        ' Hash der Bytes berechnen
        axStringBytes = oMd5Hasher.ComputeHash(axStringBytes)
        ' Die Bytes in einen Md5 String umwandeln
        Dim sMd5String As String = ""
        For i As Integer = 0 To axStringBytes.Length - 1
            sMd5String += axStringBytes(i).ToString("x2").ToLower()
        Next
        Return sMd5String
    End Function
    Private Sub userlist_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim myData As New DataSet
        Dim cmd As New MySql.Data.MySqlClient.MySqlCommand
        Dim myAdapter As New MySql.Data.MySqlClient.MySqlDataAdapter
        Dim myConnection As New MySql.Data.MySqlClient.MySqlConnection("server=meineseite.de;" _
            & "uid=dbuser;" _
            & "pwd=password;" _
            & "database=dbname;")
        
        Label1.Text =CheckJoomlaPassword(TextBox1.Text, "tbl_user")
   

        TextBox1.Clear()

    End Sub

End Class

hab die using nur auskommentiert damit ich weiss das die ursprünglich dahin gehörten.

Wie oben genannt gibt mir die Funktion immer nur false aus .
 
Klar, Du übergibts an die CheckJoomlaPassword nur den String "tbl_user". Du musst natürlich auf die user Tabelle einen Select machen und den richtigen Wert der Passwortspalte übergeben. Sonst wird der Text aus der Textbox nur gegen "tbl_user" validiert.
 
Also wenn ich dich Richtig verstehe müsste meine Syntax also wie folgt lauten :

Code:
' Imports:
'using System;
'using System.Text;
'using System.Security.Cryptography;

''' <summary>
''' Eine Helferklasse welche Methoden zur Verfügung stellt um Passwörter
''' von Joomla zu überprüfen.
''' </summary>
Public Class userlist
    ''' <summary>
    ''' Überprüft ob das angegebene Passwort für den Datenbankeintrag 
    ''' übereinstimmt.
    ''' </summary>
    ''' <param name="sPassword">Das Passwort in Klartext welches validiert werden soll.</param>
    ''' <param name="sDbEntry">
    ''' Der Datenbankeintrag welcher das Originalpasswort im Format
    ''' VerschluesseltesPasswort:Salt beinhaltet.
    ''' </param>
    ''' <returns>true wenn das angegebene Passwort mit dem Passwort des Datenbankeintrags übereinstimmt.</returns>
    ''' 

    Public Shared Function CheckJoomlaPassword(ByVal sPassword As String, ByVal sDbEntry As String) As Boolean
        ' Ungültige Argumente?
        If String.IsNullOrEmpty(sPassword) Then
            Throw New ArgumentNullException("sPassword")
        End If
        If String.IsNullOrEmpty(sDbEntry) Then
            Throw New ArgumentNullException("sDbEntry")
        End If
        ' Datenbankeintrag splitten (Nur 2 Teile)
        ' Md5Pass:Salt wird zu:
        ' [0] --> Md5Pass
        ' [1] --> Salt
        Dim asDbParts As String() = sDbEntry.Split(New Char() {":"c}, 2)
        Dim sHashedPass As String
        ' Wirklich 2 Elemente im Array?
        If asDbParts.Length = 2 Then
            ' Salt und Passwort zusammenfügen
            Dim sCombinedPassword As String = asDbParts(0) + asDbParts(1)
            ' Passwort hashen
            sHashedPass = CalculateMD5Hash(sCombinedPassword)
        Else
            ' Kein Salt
            ' Ohne Salt einfach ganzen Eintrag hashen
            sHashedPass = CalculateMD5Hash(sDbEntry)
        End If
        ' Übereinstimmung zurückgeben
        Return sPassword.Equals(sHashedPass, StringComparison.CurrentCultureIgnoreCase)
    End Function

    ''' <summary>
    ''' Berechnet einen MD5 Hash des angegebenen Strings.
    ''' </summary>
    ''' <param name="sToHash">Der String welcher gehasht werden soll. </param>
    ''' <returns>Einen 32 Zeichen langen Hex String welcher der MD5 Hash 
    ''' des angegebenen Strings entspricht.</returns>
    Private Shared Function CalculateMD5Hash(ByVal sToHash As String) As String
        ' Einen MD5 Hasher Erstellen
        Dim oMd5Hasher As New System.Security.Cryptography.MD5CryptoServiceProvider()
        ' Bytes des Strings holen
        Dim axStringBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(sToHash)
        ' Hash der Bytes berechnen
        axStringBytes = oMd5Hasher.ComputeHash(axStringBytes)
        ' Die Bytes in einen Md5 String umwandeln
        Dim sMd5String As String = ""
        For i As Integer = 0 To axStringBytes.Length - 1
            sMd5String += axStringBytes(i).ToString("x2").ToLower()
        Next
        Return sMd5String
    End Function
    Private Sub userlist_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim myData As New DataSet
        Dim wert As String = ""
        Dim cmd As New MySql.Data.MySqlClient.MySqlCommand
        Dim myAdapter As New MySql.Data.MySqlClient.MySqlDataAdapter
        Dim myConnection As New MySql.Data.MySqlClient.MySqlConnection("server=meineseite.de;" _
            & "uid=dbuser;" _
            & "pwd=password;" _
            & "database=dbname;")

        Dim mySelectQuery As String = "SELECT  password FROM tbl_user;"
        Dim myCommand As New MySql.Data.MySqlClient.MySqlCommand(mySelectQuery, myConnection)





        cmd.Connection = myConnection

        Dim myReader As MySql.Data.MySqlClient.MySqlDataReader
        myReader = myCommand.ExecuteReader()
        While myReader.Read()

           
            CalculateMD5Hash(wert)
            Label1.Text =  CheckJoomlaPassword(TextBox1.Text, mySelectQuery)

            TextBox1.Clear()

            

        End While
        
    End Sub
End Class

Mag aber warscheinlicher sein das ich dich falsch verstanden habe , weil es beim drücken des Buttons zu einen Fehler kommt.
 
Ich programmiere normal nie VB.net und mit der MySql API kenn ich mich auch nicht gut aus, aber ich hoffe dieser Code funktioniert. Voraussetzung sind natürlich eine Textbox für den Benutzernamen (UserNameTextBox) und das Passwort (PasswordTextBox). Dann holst du den Eintrag für den entsprechenden User in der Datenbank und überprüfst ob das Passwort dazu passt.
Visual Basic:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		
		' Datenbankverbindung
		' Query unsicher! (SqlInjection)
		Dim sUserQuery As String = "SELECT password FROM tbl_users WHERE username='" & UserNameTextBox.Text & "' LIMIT 0,1" 
        Dim oConnection As New MySql.Data.MySqlClient.MySqlConnection("server=meineseite.de;" _
            & "uid=dbuser;" _
            & "pwd=password;" _
            & "database=dbname;")
		Dim oUserCommand As New MySqlCommand(SUserQuery, oConnection)
		oConnection.Open()
		
		' Query ausführen
		Dim oUserReader As MySqlDataReader
		oUserReader = oUserCommand.ExecuteReader()
		
		' Eintrag versuchen zu laden
		If oUserReader.Read() Then
			'  Holen ob das Passwort stimmt
			Dim bPassOk As Boolean
			bPassOk = CheckJoomlaPassword(PasswortTextBox.Text, oUserReader.GetString(0))
			If bPassOk Then
				Label1.Text = "Passwort OK!"
			Else
				Label1.Text = "Passwort FALSCH!"
			End If
			
		End If
        
End Sub
 
Scheint leider nicht zu funktionieren , hab es so aufgebaut wie du es beschrieben hast.

Doch ich kriege immer ein Passwort Falsch ausgegeben.

Zur Kontrolle hier nochmal der Code :

Code:
' Imports:
'using System;
'using System.Text;
'using System.Security.Cryptography;

''' <summary>
''' Eine Helferklasse welche Methoden zur Verfügung stellt um Passwörter
''' von Joomla zu überprüfen.
''' </summary>
Public Class userlist
    ''' <summary>
    ''' Überprüft ob das angegebene Passwort für den Datenbankeintrag 
    ''' übereinstimmt.
    ''' </summary>
    ''' <param name="sPassword">Das Passwort in Klartext welches validiert werden soll.</param>
    ''' <param name="sDbEntry">
    ''' Der Datenbankeintrag welcher das Originalpasswort im Format
    ''' VerschluesseltesPasswort:Salt beinhaltet.
    ''' </param>
    ''' <returns>true wenn das angegebene Passwort mit dem Passwort des Datenbankeintrags übereinstimmt.</returns>
    ''' 

    Public Shared Function CheckJoomlaPassword(ByVal sPassword As String, ByVal sDbEntry As String) As Boolean
        ' Ungültige Argumente?
        If String.IsNullOrEmpty(sPassword) Then
            Throw New ArgumentNullException("sPassword")
        End If
        If String.IsNullOrEmpty(sDbEntry) Then
            Throw New ArgumentNullException("sDbEntry")
        End If
        ' Datenbankeintrag splitten (Nur 2 Teile)
        ' Md5Pass:Salt wird zu:
        ' [0] --> Md5Pass
        ' [1] --> Salt
        Dim asDbParts As String() = sDbEntry.Split(New Char() {":"c}, 2)
        Dim sHashedPass As String
        ' Wirklich 2 Elemente im Array?
        If asDbParts.Length = 2 Then
            ' Salt und Passwort zusammenfügen
            Dim sCombinedPassword As String = asDbParts(0) + asDbParts(1)
            ' Passwort hashen
            sHashedPass = CalculateMD5Hash(sCombinedPassword)
        Else
            ' Kein Salt
            ' Ohne Salt einfach ganzen Eintrag hashen
            sHashedPass = CalculateMD5Hash(sDbEntry)
        End If
        ' Übereinstimmung zurückgeben
        Return sPassword.Equals(sHashedPass, StringComparison.CurrentCultureIgnoreCase)
    End Function

    ''' <summary>
    ''' Berechnet einen MD5 Hash des angegebenen Strings.
    ''' </summary>
    ''' <param name="sToHash">Der String welcher gehasht werden soll. </param>
    ''' <returns>Einen 32 Zeichen langen Hex String welcher der MD5 Hash 
    ''' des angegebenen Strings entspricht.</returns>
    Private Shared Function CalculateMD5Hash(ByVal sToHash As String) As String
        ' Einen MD5 Hasher Erstellen
        Dim oMd5Hasher As New System.Security.Cryptography.MD5CryptoServiceProvider()
        ' Bytes des Strings holen
        Dim axStringBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(sToHash)
        ' Hash der Bytes berechnen
        axStringBytes = oMd5Hasher.ComputeHash(axStringBytes)
        ' Die Bytes in einen Md5 String umwandeln
        Dim sMd5String As String = ""
        For i As Integer = 0 To axStringBytes.Length - 1
            sMd5String += axStringBytes(i).ToString("x2").ToLower()
        Next
        Return sMd5String
    End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        
        ' Datenbankverbindung
        ' Query unsicher! (SqlInjection)
        Dim sUserQuery As String = "SELECT password FROM tbl_users WHERE username='" & UserNameTextBox.Text & "' LIMIT 0,1" 
        Dim oConnection As New MySql.Data.MySqlClient.MySqlConnection("server=meineseite.de;" _
            & "uid=dbuser;" _
            & "pwd=password;" _
            & "database=dbname;")
        Dim oUserCommand As New MySqlCommand(SUserQuery, oConnection)
        oConnection.Open()
        
        ' Query ausführen
        Dim oUserReader As MySqlDataReader
        oUserReader = oUserCommand.ExecuteReader()
        
        ' Eintrag versuchen zu laden
        If oUserReader.Read() Then
            '  Holen ob das Passwort stimmt
            Dim bPassOk As Boolean
            bPassOk = CheckJoomlaPassword(PasswortTextBox.Text, oUserReader.GetString(0))
            If bPassOk Then
                Label1.Text = "Passwort OK!"
            Else
                Label1.Text = "Passwort FALSCH!"
            End If
            
        End If
        
End Sub
 
Dann versuch mal das ganze im Debugger step-by-step durchzugehen. Kontrolliere ob der Datenbankeintrag das richtige Format hat Passwort:Salt . Dann kontrolliere weiters was während der Berechnung des Hashes passiert bzw. was als Ergebnis ausgegeben wird. Und als letztens musst du noch kontrollieren ob der Salt wirklich nur an das Originalpasswort angehängt werden muss. Zudem ist noch ein Bug in der CheckJoomlaPassword():
' Salt und Passwort zusammenfügen
Dim sCombinedPassword As String = asDbParts(0) + asDbParts(1)
sollte so lauten:
' Salt und Passwort zusammenfügen
Dim sCombinedPassword As String = asDbParts(0) & asDbParts(1)
Somit werden die Strings richtig verkettet.
 
Also ich hab Debugging nun versucht und hab bei beiden textboxen mal tesweise admin eingegeben.

die Ausgaben die ich dann per Debugging bekomme sind :

Code:
		sHashedPass	"0d2102de070177c77d74f9c65f7744dd"	String
+		axStringBytes	{Length=16}	Byte()
		sMd5String	"0d2102de070177c77d74f9c65f7744dd"	String
		sCombinedPassword	Nothing	String
+		asDbParts	{Length=2}	String()
		sHashedPass	"0d2102de070177c77d74f9c65f7744dd"	String

Der Fehler wird warscheinlich beim SCombinedpassword liegen , nur wieso muss ich noch herausfinden.
 
1. Hast du den Fehler von oben korrigiert?
2. Welche Werte hast du für die einzelnen Elemente in asDbParts?
3. Gibt es einen User admin mit Passwort admin in deiner Datenbank?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück