【问题标题】:how to compare binary in mysql with JAVA如何将mysql中的二进制文件与JAVA进行比较
【发布时间】:2013-08-03 15:20:44
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • 为什么将密码存储为二进制类型?
  • 这就是我的想法,因为我不使用数据库,我只是一个开发人员,我只是从数据库开发人员那里得到这个数据库..你不推荐这个吗?

标签: java mysql


【解决方案1】:

我对你为什么使用二进制类型感到困惑,但你可以试试:

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 额外的安全性)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 请注意,MD5 不是加密,而仅仅是哈希函数。加密意味着涉及某种密钥,只要您拥有该密钥,您就可以返回原始数据。
    • 用于密码的 MD5 是个坏主意,因为它已被破坏。此外,至少这些值应该加盐。更好的是,如果必须,请使用安全哈希(SHA-2、SHA-128、SHA-256),但最好 - 无论如何密码 - 使用 bcrypt 或 PBKDF2 之类的东西。看我的回答。
    【解决方案3】:

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

    问题但是,您打算将密码直接存储在那里。请不要这样做,因为这会造成重大的安全漏洞。

    按照另一个答案中的建议对其进行散列会更好,但仍然不是很好。问题在于,存在所谓的彩虹表,可以使用反向查找散列到其原始值。

    您需要做的最低限度是使用加盐散列 (https://en.wikipedia.org/wiki/Salt_(cryptography)),或者更好的是,使用 bcrypt 或 PBKDF2 之类的东西(请参阅Password Verification with PBKDF2 in Java)来创建用户提供的密码的安全散列。这些哈希将具有固定长度,并且可以很容易地作为二进制字符串存储在给定的数据库字段中。

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

    【讨论】:

      猜你喜欢
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多