MySQL数据库有关散列/存储日期/存储电子邮件的问题

时间:2012-08-27 00:45:12

标签: mysql database

我正在尝试使用主键userid设计一个简单的用户表,然后使用userid作为users表的外键设计另一个表。我在这里有正确的想法吗?

CREATE TABLE `users` (
    `userid` INT(6) NOT NULL,
    `username` VARCHAR(50) NOT NULL,
    `password` VARCHAR(50) NOT NULL,
    `date_join` DATE NOT NULL,       <- should I just make this CURDATE instead?
    `user_handle` VARCHAR(50) NOT NULL,
    `date_modified` DATE NOT NULL,
    PRIMARY KEY (`userid`)
)

1)如何进行用户标识自动增量?

2)如何将密码存储为MD5哈希?另外,我读过各种编码器强烈推荐brcrypt,想法?

3)如何将默认user_handle设置为@符号前的电子邮件的第一部分?这样john@smith.com会产生john的用户句柄。

4)在设计用户数据库时我应该采取哪些额外的安全措施?

5)与用户关联的其他表中的外键需要一个指向用户userid的外键吗?

非常感谢,我希望这不是太多问题!

2 个答案:

答案 0 :(得分:3)

  1.   

    如何使用户ID自动增加?

    userid列中指定AUTO_INCREMENT属性:

    CREATE TABLE `users` (
        `userid` INT(6) NOT NULL AUTO_INCREMENT,
        -- etc.
    
  2.   

    如何将密码存储为MD5哈希?另外,我读过各种编码器强烈推荐brcrypt,想法?

    推荐使用MD5进行散列密码的bcrypt的主要原因是bcrypt是为此目的而设计的,而MD5旨在验证消息的完整性:因此bcrypt故意慢,而MD5故意快。这意味着攻击者需要更多的工作才能对暴力破解哈希哈希与MD5哈希相比。

    由于两个函数都产生固定大小的二进制输出(在MD5的情况下为16字节,在bcrypt的情况下为56字节),因此对于MD5而言,合理的列类型为BINARYBINARY(16)对于bcrypt BINARY(56)

    在任何一种情况下,你都应该确保你的哈希值。 Salt是一个随机字符串,在计算(最终)哈希值之前与用户密码连接:使用的盐与数据库中的用户记录一起存储,但每个用户都不同。如果您的数据库遭到入侵,这会破坏 rainbow table 攻击以恢复用户的密码。

    执行这些操作所涉及的实际代码取决于您开发应用程序的语言,库和/或框架。

  3.   

    如何将默认user_handle设置为@符号前的电子邮件的第一部分?这样john@smith.com会产生john的用户句柄。

    这种逻辑可能最适合您的应用程序代码,但也可以使用MySQL的SUBSTRING_INDEX()函数在SQL INSERT语句中完成:

    INSERT INTO users VALUES (
      -- [ deletia ]
      SUBSTRING_INDEX('john@smith.com', '@', 1),
      -- [ deletia ]
    );
    
  4.   

    设计用户数据库时我应该采取哪些额外的安全措施?

    我强烈建议您阅读this excellent post以获取相关安全概念的详尽说明。

  5.   

    与用户关联的其他表中的外键需要一个指向用户userid的外键吗?

    是。外键因其用于此目的而存在;如果您希望在MySQL中强制执行foreign key constraints(即确保引用的记录存在于外表中),则需要对本地和外部表使用InnoDB存储引擎;此外,索引必须存在于密钥的本地和外部副本上。然后使用如下的子句在引用表中定义约束:

    FOREIGN KEY (userid) REFERENCES users (userid)
    

答案 1 :(得分:2)

  1. 假设您有能力修改CREATE TABLE语句,您可以这样做:

    CREATE TABLE `users` (
        `userid` INT(6) NOT NULL AUTO_INCREMENT,
        ...
    )
    
  2. 通常,在数据库之上运行的服务器将自己生成密码哈希值(在注册和登录时),然后将哈希值作为字符串传递给数据库。因此,从数据库的角度来看,您的架构适用于此。或者接近罚款,具体取决于密码哈希的最终长度。

  3. 同样,这通常是您在服务器代码(甚至是JavaScript)中处理的内容,而不是数据库本身。一个简单的字符串split()substring()就可以完成这项工作。如果您确实想在数据库中执行此操作,可以使用trigger检测插入事件并设置所需的默认值。

  4. 是。 Salt your passwords

  5. 是的,您的其他表格会有一个引用“用户”中userid字段的键。类似的东西:

    CONSTRAINT `FK3FD7C193F39FADA` FOREIGN KEY (`owner_id`) REFERENCES `users` (`userid`)