【问题标题】:MySql Performance Question: MD5(value)MySql 性能问题:MD5(value)
【发布时间】:2009-12-17 04:34:14
【问题描述】:

出于安全目的,我以这种方式进行一些查询:

SELECT avatar_data FROM users WHERE MD5(ID) ='md5value'

所以,例如我有这个条目:

-TABLE.users-
ID | avatar_data
39 | some-data

我做这个查询:

SELECT avatar_data FROM users WHERE MD5(ID) ='d67d8ab4f4c10bf22aa353e27879133c'

'd67d8ab4f4c10bf22aa353e27879133c'是经过MD5过滤的'39'值。

我有一个非常大的数据库,里面有很多条目。我想知道这种方法是否会影响数据库性能?

【问题讨论】:

  • 我能问一下安全技术的性质吗?我的第一个想法是,如果你试图让 ID 难以猜测(也许 ID 可能是一个查询字符串参数),那么你只是在阻止最简单的尝试——你没有对哈希进行加盐,它似乎。

标签: mysql md5


【解决方案1】:

因为您在要搜索的列上使用了一个函数 ( MD5(ID)= ),所以 MySQL 必须进行全表扫描。

虽然我不确定您进行此类搜索的原因,但为了加快速度,我建议您添加另一列包含已处理的 ID 数据并将其编入索引。

所以你应该这样做:

SELECT * FROM user WHERE MD5_ID = 'd67d8ab4f4c10bf22aa353e27879133c'

【讨论】:

    【解决方案2】:

    使用该查询并且没有功能索引,是的,您可以对整个事物进行表扫描。如果您经常这样做,您可能希望将摘要预先计算到代理表或另一列中,直接索引和查找。

    【讨论】:

      【解决方案3】:

      是的,这可能会变得非常慢,而且它确实不会增加任何安全性。 '39' 的 MD5 很容易计算出来。为了使单向哈希成功,它需要包含攻击者未知的值。否则攻击者只会对值进行哈希处理,而你并没有真正完成任何事情。

      您可以考虑发布更多关于您正在做的事情的信息。例如:这是一个网络管理工具吗?有密码保护吗?等等。

      【讨论】:

        【解决方案4】:

        如果您想要这种安全性,最好将密码保存为 md5 哈希。编码 id 并不能真正提供安全性

        【讨论】:

          猜你喜欢
          • 2016-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-23
          • 2011-08-16
          • 2017-02-05
          相关资源
          最近更新 更多