2016-04-15 12 views
1

Was ist der beste Weg, Passwörter für SHA1 in einer mobilen Java-Anwendung mit SQLite zu hashen?Hash-Passwörter in Java

Unten ist, wie die Daten in die Datenbank eingefügt werden. Ich möchte, dass das Passwort gehashed wird, vorzugsweise in SHA1. Es wird verwendet, um sich auf einer anderen Seite einzuloggen, also muss ich einen ähnlichen Prozess in dieser Java-Klasse machen?

SignUp.Java

public void onSignUpClick(View v) { 
     if (v.getId() == R.id.Bsignupbutton) { 
      EditText name = (EditText) findViewById(R.id.TFname); 
      EditText email = (EditText) findViewById(R.id.TFemail); 
      EditText uname = (EditText) findViewById(R.id.TFuname); 
      EditText pass1 = (EditText) findViewById(R.id.TFpass1); 
      EditText pass2 = (EditText) findViewById(R.id.TFpass2); 
      String namestr = name.getText().toString(); 
      String emailstr = email.getText().toString(); 
      String unamestr = uname.getText().toString(); 
      String pass1str = pass1.getText().toString(); 
      String pass2str = pass2.getText().toString(); 
      if (!pass1str.equals(pass2str)) { 
       //popup msg 
       Toast pass = Toast.makeText(SignUp.this, "Passwords don't match!", Toast.LENGTH_SHORT); 
       pass.show(); 
      } else { 
       if (name.getText().toString().length() == 0) { 
        name.setError("Name Required"); 
       } else if (!email.getText().toString().matches("[a-zA-Z]{1}\\.[a-zA-Z]*[0-9]{4}@student\\.leedsbeckett\\.ac\\.uk")) { 
        email.setError("Incorrect Email Format"); 
       } else if (!uname.getText().toString().matches("[cC][0-9]{7}")) { 
        uname.setError("Incorrect ID Format"); 
       } else if (!pass1.getText().toString().matches("(?=.*[\\d])(?=.*[a-z])(?=.*[A-Z]).{8,}")) { 
        pass1.setError("Incorrect Password Format"); 
       } else { 
        //insert the details in database 
        Contact c = new Contact(); 
        c.setName(namestr); 
        c.setEmail(emailstr); 
        c.setUname(unamestr); 
        c.setPass(pass1str); 
        helper.insertContact(c); 
        Toast pass = Toast.makeText(SignUp.this, "User Registered", Toast.LENGTH_LONG); 
        pass.show(); 
        Intent i = new Intent(SignUp.this, com.example.oliver.beckettreg.MainActivity.class); 
        startActivity(i); 
       } 
      } 
     } 
    } 

Antwort

1

Sie sollten Ihr eigenes Hashing und Salze Mechanismen nicht erfinden.

Blick auf JBCrypt - eine Java-Implementierung von BCrypt:

http://www.mindrot.org/projects/jBCrypt/

Die API ist sehr einfach:

// Hash a password for the first time 
String hashed = BCrypt.hashpw(password, BCrypt.gensalt()); 

// gensalt's log_rounds parameter determines the complexity 
// the work factor is 2**log_rounds, and the default is 10 
String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12)); 

// Check that an unencrypted password matches one that has 
// previously been hashed 
if (BCrypt.checkpw(candidate, hashed)) 
    System.out.println("It matches"); 
else 
    System.out.println("It does not match"); 
+1

Dies sollte ein Kommentar sein. – tnw

0

Nehmen Sie eine Verwendung in Apache Commons Codec-Bibliothek.

https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/digest/DigestUtils.html#sha1Hex(java.lang.String)

final String SALT = "any strange string that you like"; 

String mySha1String = DigestUtils.sha1Hex(myString + SALT); 

Für Datenbank Zwecke, sollten Sie nicht das Salz ändern, so wird die SHA1 nicht gleich auf die gleiche Zeichenfolge wie eingegeben werden. Eine andere Sache, wird nicht besser SHA-3 verwenden? Ein bester Standard?

0

Es wird verwendet, um sich auf einer anderen Seite einzuloggen, also muss ich einen ähnlichen Prozess in dieser Java-Klasse machen?

Ja, Sie müssten die Hashing-Prozedur replizieren, wenn Sie prüfen, ob ein Passwort gültig ist oder nicht. Der Sinn von Passwörtern besteht darin, dass sie in Ihrer Datenbank mit einem Einweg-Hash (mit Salz) gespeichert werden. Wenn jemand den Hash eines Passworts in betrügerischer Absicht erhält, besteht keine Möglichkeit, das ursprüngliche Passwort aus dem Hash zu erhalten Theorie). Auf diese Weise unterscheidet sich das Passwort-Hashing etwas von der Kryptographie, denn wenn das ursprüngliche Passwort verschlüsselt (dh verschlüsselt) ist, interessiert Sie der ursprüngliche Wert des Passworts nicht mehr, was bedeutet, dass kein Hashalgorithmus benötigt wird umgekehrt (entschlüsselt), was normalerweise zu stärkeren Chiffren führt.

Um Ihre Frage expliziter zu beantworten, müssen Sie in Ihrer Login-Klasse (oder wo auch immer Sie Ihr Passwort überprüfen) den Hashwert erneut eingeben (mit demselben Algorithmus und demselben Salz). und prüfen, ob dieser Hash mit dem in der Datenbank gespeicherten Passwort-Hash übereinstimmt.

Wie beim Hashing selbst, sollten Sie, wie Jason anmerkte, Ihre eigene Version des Algorithmus nicht implementieren, da Sie aufgrund der Komplexität eines solchen Algorithmus sicherlich Fehler machen werden. Sie sollten nach Paketen suchen, die das implementieren, was Sie brauchen.