在Java中哈希密码

时间:2016-04-15 17:42:44

标签: java sqlite

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

4 个答案:

答案 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库中使用。

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

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

了解更多信息:How can I hash a password in Java?