2016-04-15 6 views
1

Каков наилучший способ для хэш-паролей к SHA1 в мобильном приложении Java с использованием SQLite?Хеширование паролей в Java

Ниже приведено, как данные вставляются в базу данных. Я хочу, чтобы пароль был хэширован, желательно в SHA1. Он будет использоваться для входа на другую страницу, так что мне нужно сделать аналогичный процесс в этом классе java?

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); 
       } 
      } 
     } 
    } 

ответ

1

Вы не должны придумать свое собственное хэширование и засолки механизмов.

Посмотрите на JBCrypt - реализация Java из Bcrypt:

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

API-интерфейс очень прост:

// 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

Это должен быть комментарий. – tnw

0

Возьмите использование в библиотеке Apache Commons Codec.

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); 

Для целей базы данных, вы не должны изменять соли, а значит, sha1 не будет равно одной и той же строки в качестве входных данных. Другое дело, не будет лучше использовать SHA-3? Лучший стандарт?

0

Он будет использоваться для входа на другой странице, так что мне нужно сделать аналогичный процесс в этом классе java?

Да, вам нужно будет реплицировать процедуру хэширования при проверке правильности пароля. Точка паролей заключается в том, что они хранятся в вашей базе данных с использованием одностороннего хеша (с солью), так что если кто-то получает злонамеренно получение хэша пароля, у них нет способа получить исходный пароль из хэша (в теория). Таким образом, хеширование паролей несколько отличается от криптографии, поскольку, как только исходный пароль хэшируется (т. Е. Зашифрован), вам действительно не важно исходное значение пароля, то есть нет необходимости иметь алгоритм хэширования, который может быть обратный (расшифрованный), обычно приводящий к более сильным шифрам.

Чтобы более подробно ответить на ваш вопрос в своем классе входа (или где бы вы не выполняли проверку пароля), как только пользователь предоставит вам свой пароль, вам понадобится снова его использовать (используя тот же алгоритм и ту же соль) и проверить, соответствует ли этот хэш хеш-паролю, хранящемуся в БД.

Что касается самого хэширования, как указал Джейсон, вы не должны реализовывать свою собственную версию алгоритма, так как вы наверняка ошибаетесь из-за сложности такого алгоритма. Вы должны искать некоторые пакеты, которые реализуют то, что вам нужно.

Смежные вопросы