【问题标题】:Md5 and Salt in MysqlMysql 中的 Md5 和 Salt
【发布时间】:2011-05-05 20:31:05
【问题描述】:

如何“解码”存储在各种电子商务中添加“盐”的密码。我不是密码专家......所以,过去,我使用过类似的东西:

SELECT * FROM mytable WHERE email=@email AND passwd=MD5(@pwd) 

MySql MD5 函数只接受一个参数...如果我有一个 Salt 字符串,我该怎么办? 谢谢

【问题讨论】:

标签: mysql cryptography


【解决方案1】:

您需要在 mytable 中添加一个名为 salt 的列,然后在创建 MD5 哈希时检索该值:

SELECT * FROM mytable WHERE email=@email AND passwd=MD5(salt + ':' +@pwd)

在插入记录时你会这样做:

INSERT INTO mytable(email, salt, passwd)
VALUES (@email, @salt, MD5(salt + ':' + @pwd)

【讨论】:

    【解决方案2】:

    Salt 是您添加到应加密的文本开头的字符串。

    像这样:SELECT * FROM mytable WHERE email=@email AND passwd=MD5(CONCAT(@salt, @pwd))

    【讨论】:

    • 通常在我的应用程序中,我假设盐是恒定的。当然你可以把它放在桌子上。
    • 如果盐是恒定的,那么这将消除盐的目的。如果我在我的网站上使用密码:秘密,并且我能够以某种方式访问​​您的数据库。我可以很容易地看到哪些其他用户也选择了相同的密码:秘密;因为 MD5 哈希值是相同的。
    • 没错,但是这种事件的可能性有多大?假设情况:攻击者破坏数据库并获得大量 MD5,salt 仍然保密。如果盐足够长,他将无法在合理的时间内将它们全部解码。但是当有每个用户的盐时,如果用户的密码足够短,他就可以破解它。请注意,我不是密码学专家,如果我错了,我会感谢你纠正我。
    【解决方案3】:

    该逻辑应该在应用程序中,然后您只需将计算值与存储在数据库中的值进行比较。

    (如果不在应用程序中,您可以在 MySQL 中使用函数,但我不推荐这种方法。如果可能,我喜欢将所有应用程序逻辑保存在一个地方,而不是分散在不同的地方部分。)

    如果您在查询的WHERE 子句中运行类似的函数,MySQL 将无法在passwd 上使用索引,因为它必须为passwd 列中的每个值计算一些东西。相反,在您的应用程序中进行加盐和散列处理,然后将最终字符串与您存储的信息在可以使用索引的普通查询中进行比较,如下所示

    SELECT * FROM mytable WHERE email=@email AND passwd=@pwdhash
    

    【讨论】:

    • 为什么投反对票?如果我有什么不对的地方,请指出。我也是来学习的:-)
    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 2010-11-09
    • 2012-04-10
    • 2014-08-01
    • 2014-01-26
    • 2012-02-06
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多