我有一个数据库,其中列(密码)数据类型之一是二进制(60)。
我在 java 中使用密码作为字符串,并尝试将来自 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 中将您的字段设置为 PASSWORD。这样,只要您将密码保存在数据库中,密码就会在 MD5 中进行哈希处理。要在用户登录时进行比较,您只需将用户给定的密码散列到 MD5 并对存储在数据库中的密码进行字符串比较。
将数据库字段配置为二进制字符串可能并不理想,但也不是问题。
但是,问题是您打算将密码直接存储在那里。请不要这样做,因为它会造成重大的安全漏洞。
按照另一个答案中的建议对其进行散列会更好,但仍然不是很好。问题在于,存在所谓的彩虹表,可以使用反向查找散列到其原始值。
您需要做的最低限度是使用加盐哈希(https://en.wikipedia.org/wiki/Salt_(cryptography)),或者更好的是,使用 bcrypt 或 PBKDF2 之类的东西(请参阅Java 中使用 PBKDF2 进行密码验证)来创建用户提供的密码的安全哈希。这些哈希将具有固定长度,并且可以轻松地作为二进制字符串存储在给定的数据库字段中。
检查用户条目时,只需再次执行相同的功能并将其与数据库内容进行比较。当然,您必须使用 SSL 将密码从客户端传输到服务器。