使用SQLite在移动Java应用程序中将密码散列到SHA1的最佳方法是什么?
以下是数据如何插入数据库。我希望密码被哈希,最好是在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);
}
}
}
}
答案 0 :(得分:1)
你不应该发明自己的散列和腌制机制。
看看JBCrypt-- BCrypt的Java实现:
THIS IS THE FIRST PART OF CONSOLE REPORTING FROM WILDFLY
API非常简单:
defined("FOO") ? null : define("FOO", "BAR");
答案 1 :(得分:0)
在Apache Commons Codec库中使用。
{{1}}
出于数据库目的,您不应更改salt,因此,sha1与输入的字符串不同。另外一件事,使用SHA-3会不会更好?最好的标准?
答案 2 :(得分:0)
它将用于登录另一个页面,所以我需要在该java类中执行类似的过程吗?
是的,在检查密码是否有效时,您必须复制散列过程。密码的关键在于它们使用单向散列(使用salt)存储在数据库中,这样如果有人恶意获取密码的哈希值,他们就无法从散列中获取原始密码(在理论)。这样,密码散列与加密有些不同,因为一旦对原始密码进行散列(即加密),您就不会真正关心密码的原始值,这意味着无需使用散列算法。反转(解密)通常导致更强的密码。
为了更明确地回答您的问题,在您的登录类中(或在您进行密码检查的任何地方),一旦用户提供了密码,您将需要再次哈希(使用相同的算法和相同的盐)和测试以查看此哈希是否与存储在数据库中的密码哈希匹配。
至于散列本身,正如杰森指出的那样,你不应该实现你自己的算法版本,因为你肯定会因为这种算法的复杂性而犯错误。您应该寻找一些实现您需要的软件包。
答案 3 :(得分:0)
我建议使用jBCrypt
jBCrypt是OpenBSD的Blowfish密码散列码的Java™实现
从这里查看http://www.mindrot.org/projects/jBCrypt/
和这一个:http://techblog.bozho.net/bcrypt-salt-its-the-bare-minimum/