我正在尝试使用主键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
的外键吗?
非常感谢,我希望这不是太多问题!
答案 0 :(得分:3)
如何使用户ID自动增加?
在userid
列中指定AUTO_INCREMENT
属性:
CREATE TABLE `users` (
`userid` INT(6) NOT NULL AUTO_INCREMENT,
-- etc.
如何将密码存储为MD5哈希?另外,我读过各种编码器强烈推荐brcrypt,想法?
推荐使用MD5进行散列密码的bcrypt的主要原因是bcrypt是为此目的而设计的,而MD5旨在验证消息的完整性:因此bcrypt故意慢,而MD5故意快。这意味着攻击者需要更多的工作才能对暴力破解哈希哈希与MD5哈希相比。
由于两个函数都产生固定大小的二进制输出(在MD5的情况下为16字节,在bcrypt的情况下为56字节),因此对于MD5而言,合理的列类型为BINARY
:BINARY(16)
对于bcrypt BINARY(56)
。
在任何一种情况下,你都应该确保盐你的哈希值。 Salt是一个随机字符串,在计算(最终)哈希值之前与用户密码连接:使用的盐与数据库中的用户记录一起存储,但每个用户都不同。如果您的数据库遭到入侵,这会破坏 rainbow table 攻击以恢复用户的密码。
执行这些操作所涉及的实际代码取决于您开发应用程序的语言,库和/或框架。
如何将默认
user_handle
设置为@
符号前的电子邮件的第一部分?这样john@smith.com
会产生john
的用户句柄。
这种逻辑可能最适合您的应用程序代码,但也可以使用MySQL的SUBSTRING_INDEX()
函数在SQL INSERT
语句中完成:
INSERT INTO users VALUES (
-- [ deletia ]
SUBSTRING_INDEX('john@smith.com', '@', 1),
-- [ deletia ]
);
设计用户数据库时我应该采取哪些额外的安全措施?
我强烈建议您阅读this excellent post以获取相关安全概念的详尽说明。
与用户关联的其他表中的外键需要一个指向用户
userid
的外键吗?
是。外键因其用于此目的而存在;如果您希望在MySQL中强制执行foreign key constraints(即确保引用的记录存在于外表中),则需要对本地和外部表使用InnoDB存储引擎;此外,索引必须存在于密钥的本地和外部副本上。然后使用如下的子句在引用表中定义约束:
FOREIGN KEY (userid) REFERENCES users (userid)
答案 1 :(得分:2)
假设您有能力修改CREATE TABLE
语句,您可以这样做:
CREATE TABLE `users` (
`userid` INT(6) NOT NULL AUTO_INCREMENT,
...
)
通常,在数据库之上运行的服务器将自己生成密码哈希值(在注册和登录时),然后将哈希值作为字符串传递给数据库。因此,从数据库的角度来看,您的架构适用于此。或者接近罚款,具体取决于密码哈希的最终长度。
同样,这通常是您在服务器代码(甚至是JavaScript)中处理的内容,而不是数据库本身。一个简单的字符串split()
或substring()
就可以完成这项工作。如果您确实想在数据库中执行此操作,可以使用trigger检测插入事件并设置所需的默认值。
是的,您的其他表格会有一个引用“用户”中userid
字段的键。类似的东西:
CONSTRAINT `FK3FD7C193F39FADA` FOREIGN KEY (`owner_id`) REFERENCES `users` (`userid`)