如何比较mysql中的二进制与JAVA

如何比较mysql中的二进制与JAVA,java,mysql,Java,Mysql,我有一个数据库,其中一个列(密码)数据类型是二进制(60) 我在java中使用password作为字符串,并尝试将来自java的密码(来自用户界面)与MySQL中的密码(作为二进制)进行比较 但是它从来没有给我任何结果 请说明哪些数据类型/值能够与二进制类型进行比较 谢谢我不明白您为什么使用二进制类型,但您可以试试: String password = "a password"; // Run password through cryptographic functions. String bi

我有一个数据库,其中一个列(密码)数据类型是二进制(60)

我在java中使用password作为字符串,并尝试将来自java的密码(来自用户界面)与MySQL中的密码(作为二进制)进行比较

但是它从来没有给我任何结果

请说明哪些数据类型/值能够与二进制类型进行比较


谢谢

我不明白您为什么使用二进制类型,但您可以试试:

String password = "a password";
// Run password through cryptographic functions.
String binaryStr = "";

for(char c : password)
{
    int charInt = (int)c;
    // Convert the character to it's integer representation.
    binaryStr += Integer.toBinaryString(charInt);
    // Convert that integer into a binary string.
}
BINARY和VARBINARY类型与CHAR和VARCHAR类似,只是它们包含二进制字符串而不是非二进制字符串

根据文档,您可以简单地将生成的这个新二进制值与表中的值进行比较


但是,请记住,这是一种非常奇怪的密码存储方式,仅存储消息摘要就更有意义(因为以二进制形式存储消息摘要可提供0额外的安全性)。

您应该在MySQL中将字段设置为密码。这样,每当您在db中保存密码时,密码就会在MD5中散列。要在用户登录时进行比较,只需将用户给定的密码散列到MD5,并对数据库中存储的密码进行字符串比较

将数据库字段配置为二进制字符串可能并不理想,但也不是问题

但问题是,您打算直接将密码存储在其中。请不要这样做,因为这将创建一个主要的安全漏洞

按照另一个答案中的建议进行散列比较好,但仍然不是很好。问题是,存在所谓的彩虹表,可以使用这些表将查找哈希值反转为其原始值

您至少需要使用salted hash()或者更好的方法,使用bcrypt或PBKDF2(请参阅)来创建用户提供的密码的安全hash。这些散列将具有固定的长度,并且可以很容易地作为二进制字符串存储在给定的数据库字段中


检查用户条目时,只需再次执行相同的功能,并将其与数据库内容进行比较。当然,您必须使用SSL将密码从客户端传输到服务器

为什么要将密码存储为二进制类型?这就是我的想法,因为我不是在使用数据库,我只是一个开发人员,我只是从数据库开发人员那里获得了这个数据库。你不建议这样做吗?请注意,MD5不是加密,只是一个哈希函数。加密意味着涉及某种密钥,如果您拥有该密钥,您可以返回原始数据。MD5密码是一个坏主意,因为它已被破坏。此外,至少应该对这些值进行腌制。更好的是,如果必须的话,可以使用安全散列(SHA-2、SHA-128、SHA-256),但最好使用bcrypt或PBKDF2之类的密码。看看我的答案。