Im nachhinein Android Version auf eclipse wechseln

  • Antworten:6
Volkan Aydin
  • Forum-Beiträge: 187

15.06.2014, 17:11:37 via Website

Hallo.

Nun habe ich viel, viel zeit investiert um ein Login zu schaffen, das "sicher" ist, diese ist eigentlich auch gut durchdacht.
Nun habe ich aber ein Problem bekommen, und ich habe keine Ahnung, woran es liegen könnte. Dies sieht folgendermassen aus.

Wenn ich über den emulator mit Version 4.2.2 starte, passiert folgendes. Sofern eine Internetverbindung besteht, überprüft der Code erstmal ob der Benutzer vorhanden ist (mySQL Datenbank online/über php), und natürlich ob das Passwort übereinstimmt. Falls dies der Fall ist, erstellt das App eine neue SqLite Datenbank, mit den Benutzerdaten die Online auf der MySQL Datenbank besteht. Bei einem Weiterem login ( mit Internetconnectivität ) wird dieser "Status" jedesmal aktualisiert. (Auf emulator erfolgreich getetstet)

Nun, wenn keine Internetverbindung besteht, ruft die App die SQlite direkt auf und überprüft so die benutzerdaten (Natürlich erst möglich nach einem ersten Online Login möglich......

Nun wollte ich dies auf meinem "billig" Tablet von Acer Testen (4.1.2), dort werden die Daten aber "wahrscheinlich" nicht eingetragen??? jedesmal wenn ich Online einlogge wird der Benutzer neu eingetragen, anstatt das er erkennt das diese person schon eingeloggt war und ein updatet macht. Dem entsprechend kann ich offline auch nicht einloggen da es keinen eintrag volzog.

Kann es sein das es an der Androidversion liegt?, wenn ja, kann ich im nachhinein eine ältere Version in Eclipse einstellen?
Ist das ein bekanntes Problem? Oder liegt die wahrscheinlichkeit höher, das sich vielmehr ein Programmierfehler eingeschlichen hat, und es ur per zufall am emulator funktioniert?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.06.2014, 17:26:33 via Website

Also wenn du die BuildTargets ändern willst, dann musst du das in der Manifest.xml machen (Bei eclipe)
Aber ich glaube nicht, dass dies ein Unterschied macht.
An deiner Stelle würde ich die App im Debugmodus auf dem Tablet installieren und dann diene Methoden und Results+ Variablen überprüfen.
Wenn du genug Debugmeldungen hineingeschriben hast, dann müsstest du den Fehler finden.
Könnte auch eine Exception sein, die nur auf dem "richtigen" Device auftritt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

15.06.2014, 17:48:27 via Website

Ich bin zum x-tenmal den ganzen Loginverlauf gefolgt und habe per Log.i soeben einen Fehler entdeckt.

Und zwar in der verschlüsselung. wenn ich über php mit md5 verschüssele erhalte einen wert, der ja in der sqlite dann eingetragen wird:

81dc9bdb52d04dc20036dbd8313ed055

Wenn ich nun aber keine Internetverbindung habe, und das passwort in der app mit md5 verschlüssele erhalte ich

81dc9bdb52d04dc2036dbd8313ed055

Also das man es besser sieht
81dc9bdb52d04dc20036dbd8313ed055
81dc9bdb52d04dc2036dbd8313ed055

was geht hier ab? :) Ich dachte die schlüssel währen immer gleichlang?? habe ich da einen fehler gemacht oder was???? den md5 Code habe ich direkt hineinkopiert..... (ich weiss md5 ist veraltet.. ) was braucht man überhaupt heutzutage????

public String md5(String s) {
        try {
            // Create MD5 Hash
            MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
            digest.update(s.getBytes());
            byte messageDigest[] = digest.digest();

            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            for (int i=0; i<messageDigest.length; i++)
                hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

ist da ein fehler im Code????

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.06.2014, 18:23:26 via Website

Ich würde nicht MID5 verwenden, da md5 eh nur ne prüfsumme und kein richtiger Hash ist, dass ist aber eigentlich egal.
Benutze das auch, da ich keine Lust hatte ewig im PHP die Richtigen Befehle für den gleichen Hash zu suchen.
Wie Sieht denn dein PHP Code aus?

Habe auch ein Login gabaut bei mit sieht die Hash Methode so aus:

    /**
 * Enthält die verschieden Hash Algorithmen
 * @author Pascal
 *
 */

public static enum Algorithm {MD1,MD2,MD5,SHA0,SHA1,SHA2,SHA224,SHA256,SHA384,SHA512};

/**
 * Berechenet den Hash des Strings mit dem angegebenen Algorithmus
 * @param s String der zu einem Hash verarbetet werden soll.
 * @param hash Der Hashalgorithmus
 * @return Hashwert des angegebenen Strings
 */
public static String createHash(String s,Algorithm hash)
{

String hashString = hash.toString();

if(hashString.startsWith("SHA"))
{

    hashString = hashString.substring(0, 3) + "-"+ hashString.substring(3);

}

    String toHash = s;

      MessageDigest digest=null;
     try {
         digest = MessageDigest.getInstance(hashString );
     } catch (NoSuchAlgorithmException e1) {
         // TODO Auto-generated catch block
         e1.printStackTrace();
         Log.d("Error", e1.getMessage() + "\n Eingestellter Algorithmus wurde nicht gefunden!");
     }
        digest.reset();
        return String.format("%0" + (digest.digest(toHash.getBytes()).length*2) + "X", new BigInteger(1, digest.digest(toHash.getBytes()))).toLowerCase();

}

PHP sieht Bei mit so aus:

<?php

echo md5($content); //Wenns ein php script ist dass mit include eingebunden wird, müsste noch der Interpreter ausgeführt werden

?>
Benutzen tue ich meinen Code so:

String hash = Hash.createHash("deinString", Algorithm.MD5);

Habe die Enumeration und die Methode noch in einer Klasse Hash drinne.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

15.06.2014, 18:41:08 via Website

also mein php Code ist ganz einfach ;)

Ich sende per Post das Passwort und dieser wird dann einfach ge' md5't :)

<?php $_POST[pw] = md5($_POST[pw]); ?>

dieser wird dann in der MySQL db eingetragen...

......
Ich brauche ein paar minuten/stunden bis ich genau kapiere was dein Code macht..... ich hatte bissher nur mit php/md5 gearbeitet, da ich der meinung bin/war das all diese Hash's, allesamt für die Katz sind, da sie ja bekannt sind, und alle wohl geknackt werden können ;)........

Weshalb verwendest du den gleich dutzende algoritmen? oder hast du die jetzt für mich gleich aufgezählt???
Was genau macht

if(hashString.startsWith("SHA"))
{

    hashString = hashString.substring(0, 3) + "-"+ hashString.substring(3);

}

machst du hier dein hash individuell auf dich zugeschnitten??, verstehe ich das richtig? weshalb braucht es eigentlich diese (Algorithm hash) . Es sind ja immer Strings??? :)

Und trotzdem, wieso sind die md5 unterschiedlich :) php/java?????

Viele dumme fragen... sorry!

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.06.2014, 20:05:54 via Website

Kein Problem;
Die Gepostete Zeile sorgt für die Erkennung ob in der Enumeration ein MD oder SHA Hash ausgewählt wurde.
Dann wird vor der Zahl SHA512 also vor der 512 ein substring gemacht und dazwischen ein Bindestrich (-) eingefügt.
Nach dieser Operation sieht der String so aus: SHA-512.

Dieser String kann nun an den MessageDigest übergeben werden, dieser übernimmt dann das Erstellen des Hashes.
Das hinzufügen des Bindestrichs ist notwendig, da der MessageDigest den String nur mit Bindestrich animmt.
In einer Enumeration ist aber kein Bindestrich im Namen erlaubt, somit muss ich ihn bei den SHA Algorithmen selber per Code hinzufügen.
Für den String der gehasht werden soll, ist dies Egal.
Dieser bleibt gleich.

Und dein PHP: Arghhh

$hash= md5($_POST[pw]);

Man sollte immer eine neue variable anlegen, ist stilistisch schöner und auf jeden Fall besser, angenommen do bräuchtest im spätern Skript die Orginal Post Variable noch, was machst du dann?
Ich empfehle das so zu machen.
Ist später dann auch besser zu lesen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

15.06.2014, 21:28:36 via Website

Vielen Dank für deine erneute hilfe! jetzt weiss ich was du mir sagen wolltest, beim nächsten App werde ich dies dann sicher anwenden.... ich habe es so gelöst, das der hash nicht mehr von der php seite in die sqlite db eingetragen wird, sondern das das App es selber erstellt.... nun funktioniert alles so wie ich es wollte :)

Naja diese php seite wurde speziell nur für das login mit Json rückgabe erstellt. mir ist aber klar was du meinst....

Endlich! einen ganzen Monat habe ich gebraucht... aber langsam weiss ich was Java zu bieten hat.... nur das mit den Treads bringt mir noch ein bisschen Kopfschmerzen. War aber stets lösbar :)

Vielen Dank!!!

Antworten