2013-08-01 148 views
2

我正在创建一个登录表单,我希望密码区分大小写。我写了下面的代码。如何使用where子句使其区分大小写。区分大小写查询

PreparedStatement stm = con.prepareStatement(" select * from user where userid =? and password =?"); 

stm.setString(1, userid); 
stm.setString(2, pswd);   
ResultSet rs =stm.executeQuery(); 
if (!rs.next()) { 
    JOptionPane.showMessageDialog(this, "Invalid Id/Password"); 
} 

回答

2

除了其他更好的建议,你可以尝试的一件事是使用BINARY OPERATOR,这将迫使MySQL检查确切的情况。

select * from user where userid=? and BINARY password=? 

恕我直言,Martijn's answer是你应该遵循的。

+0

谢谢。有效 :) – Malwaregeek

4

那么,密码应该散列(至少!)与功能,如sha1Sha1为不同的首都返回一个完整的其他值。

如果你有不区分大小写的结果,你很可能会将它保存为纯文本,应该修改它。

String - sha1 value 
example - c3499c2729730a7f807efb8676a92dcb6f8a3f8f 
Example - 0f01ed56a1e32a05e5ef96e4d779f34784af9a96 
eXample - decb1226835e95f0441ec4ee0ecd9283796a9cfb 

你也可以改变你的DB列utf8_general *代替utf8_general_ci *,CI表示CaseInsentative。但是,你真的不希望做这样
* Asuming您使用UTF8


我不知道在java中可用的功能,但原则保持不变。我建议你做一些关于如何使用java存储密码的研究:)

+1

对于密码我建议使用更强大,更安全的散列,如pbkdf2,bcrypt或scrypt –

+0

啊'pbkdf2',我昨天在找那个,忘了名字。你是对的,但更多的是关于我的原则。 +1 – Martijn

+0

感谢您的出色建议,我会深入研究这一点。 – Malwaregeek

2

以纯文本存储密码是一个坏主意。至少使用md5哈希。

+0

不,sha1至少:) md5应该被认为对于那些有合理时间的人来说是易碎的 – Martijn

+0

谢谢你的提示。我是初学者,请记住下次:) – Malwaregeek