在Python脚本中,我使用由os.urandom中的数据组成的盐生成scrypt哈希,我想将它们保存在MySQL表中。如果我尝试使用标准方法,我已经看到用于在数据库中有效地存储哈希值,使用CHAR列,我得到哈希和盐的“不正确的字符串值:”错误。我能找到的唯一数据类型允许随机数据是blob,但由于blob存储在表外,因此存在明显的效率问题。
这样做的正确方法是什么?我是否应该在将数据插入数据库之前对数据执行某些操作以按下它以使其被CHAR接受?是否有另一种更适合的MySQL数据类型?
编辑:
有人要求代码,所以,当我这样做时:
salt = os.urandom(255)
hash = scrypt.hash(password,salt,1<<15,8,1,255)
cursor.execute("INSERT INTO users (email,hash,salt) values (%s,%s,%s)", [email,hash,salt])
当我尝试插入这些值时,MySQL给出了“错误的字符串值”错误。
编辑2:
根据Joran的要求,这里的架构不是这样的:
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(254) NOT NULL DEFAULT '',
`hash` char(255) NOT NULL,
`salt` char(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
答案 0 :(得分:2)
您的哈希值是一个二进制值,如果它被解释为字符串,则很可能包含“不可打印的字符”。要存储任意二进制数据,请使用the BINARY or VARBINARY数据类型。
如果必须使用字符串数据类型,则可以使用base64 encoding将任意数据转换为ASCII字符串。