2016-04-26 12 views
1

Ich brauche Passwort zu verschlüsseln ich bin mit this TutorialEncrypted String byte []

ich brauche das verschlüsselte Passwort in SQL-Datenbank als Zeichenfolge zu speichern, wenn ich versuche, Zeichenfolge zu lesen und konvertieren byte [] ich habe ein Problem, das byte [] unterscheidet sich von der ursprünglichen verschlüsselten byte []

byte[] encrypted = encryper.encrypte("pavel"); 

      Log.i("info","encrypted : "+encrypted); 

      String pass = String.valueOf(encrypted); 

      byte[] passBytes = pass.getBytes(); 

      Log.i("info","passBytes : "+passBytes); 

      Log.i("info","decrypted : "+encryper.decrypte(passBytes)); 

log

I/info: encrypted : [[email protected] 
I/info: passBytes : [[email protected] 
I/info: decrypted : 

Entschlüsseln Methode

public String decrypte(byte[] text) 
{ 

    byte[] textDecrypted = new byte[0]; 

    try { 

     cipher.init(Cipher.DECRYPT_MODE, myDesKey); 
     textDecrypted = cipher.doFinal(text); 
     Log.i("info","do final : "+textDecrypted); 

    }catch (InvalidKeyException e) {e.printStackTrace(); 
    }catch (IllegalBlockSizeException e){e.printStackTrace();} 
    catch (BadPaddingException e){e.printStackTrace();} 

    return new String(textDecrypted); 
} 

aber wenn ich schreibe public String decrypte (byte [] Text) {

byte[] textDecrypted = new byte[0]; 

    try { 

     cipher.init(Cipher.DECRYPT_MODE, myDesKey); 
     textDecrypted = cipher.doFinal(text); 
     Log.i("info","do final : "+textDecrypted); 

    }catch (InvalidKeyException e) {e.printStackTrace(); 
    }catch (IllegalBlockSizeException e){e.printStackTrace();} 
    catch (BadPaddingException e){e.printStackTrace();} 

    return new String(textDecrypted); 
} 

, aber wenn ich das ursprüngliche Byte setzen [] alle Arbeiten

encryper.decrypte(encrypted) 
+0

Über Ihre Anforderungen: Wenn Sie diese Arbeit machen, um etwas/zum Spaß zu lernen: Großartig! Wenn Sie vorhaben, Passwörter verschlüsselt in einer Datenbank zu speichern: Tun Sie es nicht. Angreifer, die Zugriff auf die Datenbank haben, können das Passwort abrufen. Speichern Sie stattdessen einen ** gesalzenen ** Hash mit einer Methode, die absichtlich die Suche verlangsamt. Für weitere Informationen siehe https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/ –

Antwort

2

Ich würde das Byte-Array zu String mit Base64.Encoder (java.util, seit Java 8) kodieren, dann speichern Sie es in DB, dann lesen Sie es von DB zu String und entschlüsseln es in Byte-Array mit Base64.decoder

1

Was Sie sehen, auf der Konsole ist das Ergebnis der toString() Methode von byte[]. Es repräsentiert nicht die tatsächlichen Inhalte. Stattdessen ist es eine ID für das Objekt. Sie sind anders, weil Sie verschiedene Objekte haben.

Auch wenn Sie String.valueOf(encrypted) verwenden, fällt es auf valueOf(Object) method zurück, da es keine gibt. Dadurch erhalten Sie keine String-Repräsentation des Inhalts Ihres Arrays, sondern die gleiche Objekt-ID, die von toString() erzeugt wird.

Verwendung z.B. new String(encrypted), um den Inhalt des Bytearrays in eine lesbare Zeichenfolge umzuwandeln.

+0

wenn ich neue Zeichenfolge (verschlüsselt) habe ich habe + ^ $ ist normal? und ich verstehe nicht, wie ich die Zeichenfolge in der Datenbank in Byte [] umwandeln? –

+0

Das scheint ein Problem mit der Codierung. Es gibt auch Konstruktoren, in denen Sie die Kodierung angeben können, die Sie verwenden. –