Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:通过哈希选择:这可能吗?_Mysql_Sql_Md5 - Fatal编程技术网

MySQL:通过哈希选择:这可能吗?

MySQL:通过哈希选择:这可能吗?,mysql,sql,md5,Mysql,Sql,Md5,我认为它没有太多意义。尽管这样,您可以从.php文件中隐藏真正的静态值,但将其哈希值保留在php文件中以供mysql查询。无法从用户的机器上访问php文件的源,但是您已经对文件进行了备份,并且静态值就在那里。我相信,选择使用列哈希将解决这个问题 但是,我没有发现任何示例或文档说明可以在查询中使用此类函数(不是针对sql查询中的值,而是针对要选择的列)。 这可能吗?应该注意的是,以这种方式设置系统实际上不会解决特定情况下的任何问题。这样做并不是让你的系统更安全,而是让它更复杂 从源代码库隐藏秘密值

我认为它没有太多意义。尽管这样,您可以从.php文件中隐藏真正的静态值,但将其哈希值保留在php文件中以供mysql查询。无法从用户的机器上访问php文件的源,但是您已经对文件进行了备份,并且静态值就在那里。我相信,选择使用列哈希将解决这个问题

但是,我没有发现任何示例或文档说明可以在查询中使用此类函数(不是针对sql查询中的值,而是针对要选择的列)。
这可能吗?

应该注意的是,以这种方式设置系统实际上不会解决特定情况下的任何问题。这样做并不是让你的系统更安全,而是让它更复杂

从源代码库隐藏秘密值的标准方法是将这些秘密值存储在单独的文件中,并且从不将该文件提交给源代码管理或对其进行备份。使用php代码加载secret的值,然后直接在MySQL中使用该值(一种方法是存储一个“config.php”文件或类似的东西,只设置变量/常量,然后php就包含该文件)

尽管如此,我还是会回答你的问题

MySQL实际上有各种各样的散列和加密功能。看

既然您标记了您的问题
md5
,我假设您要查找的函数是md5:

您可以这样选择它:

SELECT MD5(column) AS hashed_column FROM table
然后,要与哈希值进行比较的值将位于列别名“hashed_column”中

或根据哈希值选择特定行:

SELECT * FROM table WHERE MD5(column) = 'hashed-value-to-compare'

应该注意的是,以这种方式设置系统实际上并不能解决特定情况下的任何问题。这样做并不是让你的系统更安全,而是让它更复杂

从源代码库隐藏秘密值的标准方法是将这些秘密值存储在单独的文件中,并且从不将该文件提交给源代码管理或对其进行备份。使用php代码加载secret的值,然后直接在MySQL中使用该值(一种方法是存储一个“config.php”文件或类似的东西,只设置变量/常量,然后php就包含该文件)

尽管如此,我还是会回答你的问题

MySQL实际上有各种各样的散列和加密功能。看

既然您标记了您的问题
md5
,我假设您要查找的函数是md5:

您可以这样选择它:

SELECT MD5(column) AS hashed_column FROM table
然后,要与哈希值进行比较的值将位于列别名“hashed_column”中

或根据哈希值选择特定行:

SELECT * FROM table WHERE MD5(column) = 'hashed-value-to-compare'

一个非常慢的查询,它只选择所有“列”为空的行


如果你做了很多这些查询,考虑保存MD5散列在一个列或索引中。更好的做法是在脚本结束时进行所有MD5计算—当您的项目需要一个额外的服务器时,您会注意到Web服务器比数据库服务器扩展得更好。(当然,这是将来需要担心的问题)

一个非常慢的查询,它只选择所有带有空“列”的行


如果你做了很多这些查询,考虑保存MD5散列在一个列或索引中。更好的做法是在脚本结束时进行所有MD5计算—当您的项目需要一个额外的服务器时,您会注意到Web服务器比数据库服务器扩展得更好。(这当然是将来需要担心的问题)

如果我理解正确,您希望使用散列作为主键:

INSERT INTO MyTable (pk) VALUES (MD5('plain-value'));
然后,您希望通过哈希检索它,而不知道它的哈希摘要是什么:

SELECT * FROM MyTable WHERE pk = MD5('plain-value');
不知何故,这应该提供更高的安全性,以防有人窃取您的数据库和PHP代码的备份?嗯,没有。如果我知道原始的普通值和散列方法,我就可以像没有散列值一样轻松地找到数据

我同意@scunliffe的评论——我们不确定你到底想解决什么问题,但听起来这种方法解决不了问题

将MD5哈希摘要用作主键也是低效的。您必须将其存储在一个字符(32)中,或者将其解压缩并存储在二进制文件(16)中。无论如何,不能使用INT甚至BIGINT作为主键数据类型。键值更大,因此索引更大


此外,新行将插入聚集索引中的任意位置。这比在B-树的末尾添加新值要昂贵得多,如果您像其他人一样使用简单的自动递增整数,您会这样做。

如果我理解正确,您希望使用散列作为主键:

INSERT INTO MyTable (pk) VALUES (MD5('plain-value'));
然后,您希望通过哈希检索它,而不知道它的哈希摘要是什么:

SELECT * FROM MyTable WHERE pk = MD5('plain-value');
不知何故,这应该提供更高的安全性,以防有人窃取您的数据库和PHP代码的备份?嗯,没有。如果我知道原始的普通值和散列方法,我就可以像没有散列值一样轻松地找到数据

我同意@scunliffe的评论——我们不确定你到底想解决什么问题,但听起来这种方法解决不了问题

将MD5哈希摘要用作主键也是低效的。您必须将其存储在一个字符(32)中,或者将其解压缩并存储在二进制文件(16)中。无论如何,不能使用INT甚至BIGINT作为主键数据类型。键值更大,因此索引更大


此外,新行将插入聚集索引中的任意位置。这比在B-树的末尾添加新值要昂贵得多,如果像其他人一样使用简单的自动递增整数,您会这样做。

这听起来像是在试图解决一个不存在的问题。忘记解决方案