Php 存储MD5哈希或NULL的最佳MySQL数据类型

Php 存储MD5哈希或NULL的最佳MySQL数据类型,php,mysql,md5,Php,Mysql,Md5,我有一个PHP应用程序,它将所有帐户存储在一个表中,而不管它们是否处于活动状态。该表有一个名为“active”的列,该列要么为NULL,表示该帐户处于活动状态;要么包含一个MD5哈希,表示该帐户处于非活动状态 根据,如果列始终包含MD5哈希且从不为NULL,则首选二进制(16),其次是CHAR(32)。由于我的大多数帐户都处于活动状态,因此大多数列值都将为空,因此我最好使用不同的数据类型,如VARCHAR(32)?注意: 更新日期:2019年11月5日 理想情况下,您不应该再使用MD5来散列密码

我有一个PHP应用程序,它将所有帐户存储在一个表中,而不管它们是否处于活动状态。该表有一个名为“active”的列,该列要么为NULL,表示该帐户处于活动状态;要么包含一个MD5哈希,表示该帐户处于非活动状态

根据,如果列始终包含MD5哈希且从不为NULL,则首选二进制(16),其次是CHAR(32)。由于我的大多数帐户都处于活动状态,因此大多数列值都将为空,因此我最好使用不同的数据类型,如VARCHAR(32)?

注意: 更新日期:2019年11月5日

理想情况下,您不应该再使用MD5来散列密码。 PHP手册增加了一个类似4-5年前的章节,现在我相信这里解释了
password\u hash()
password\u verify()
,以及MD5/SHA1不适用的原因

请记住,大多数RDM的设计目的是提供非常稳定的时间,因为大多数RDM在内存和/或索引中缓冲数据,这使得
password
列位于
WHERE
子句中时很可能发生定时攻击

密码\u verify()
与SQL结合使用的安全方法是使用“伪”PHP代码

$row = prepare("SELECT password FROM users WHERE username = :username").execute().fetch(); 
if (password_verify($_POST['password'], $row->password)) { 
  // password correct
} else {
  // password incorrect..
}
在文件strings/ctype bin.c中的MySQL源代码中定义了二进制类型

这看起来像是转换为二进制的默认基于C ascii的字符集。理论上,这应该比使用ascii_bin字符集的字符(32)更快

因为写入/读取二进制文件所需的时间更少,索引和内存中占用的磁盘空间也更少,而且CHAR(32)数据类型大16字节

如果你想使用这个,你应该使用这个php代码

<?php
  md5 ( "password", true ); // true returns the binary what is 16 bytes long  MySQl BINARY(16)
?>

使用VARCHAR没有意义。MD5哈希值始终为128位,因此字符(32)保存十六进制数字的字符串,或者二进制(16)在取消十六进制数字的表达式()后保存字节字符串

使用NULL与数据类型选择无关。MySQL可以存储NULL来代替字符串,可以是CHAR或VARCHAR。但事实上,在InnoDB的默认行格式中,MySQL根本不存储空值,它对空值列不存储任何内容


参考:

  • 有关空值的有用说明:

    对于第三行,我在字段2和字段3中插入了null。因此,在“开始偏移量”字段中,这些字段的顶部位为on(值为94十六进制、94十六进制,而不是14十六进制、14十六进制)行较短,因为空值不占用空间。


(我的重点)

您可以使用php函数md5();
效率更高,如果任何人都能在您发送到数据库时捕获数据,那么这些数据就会被加密。

是的,您可以
VARCHAR(32)
更可取。可能是感谢法案的副本,因此根据您的回答,我理解如果我使用CHAR(32)或BINARY(16),并且存储值为空,那么我的开销不会大于使用VARCHAR(32)。谢谢,我希望你是对的+1 Bill和@user1032531 Bill表示应该使用字符(32)或二进制(16)。是的,当您使用VARCHAR时,您的开销会更大,因为MySQL需要额外节省两条短裤来了解您的VARCHAR有多大。当您定义ascii_bin字符集时,字符列上的精确查找键应该更快。这是如何回答这个问题的?