我正在研究在PHP.NET上散列数据并将密码存储到数据库。 这个网站说:
如果您要将数据存储在MySQL数据库中,请记住varchar字段在插入过程中会自动删除尾随空格。由于加密数据可以在空格(ASCII 32)中结束,因此删除会损坏数据。将数据存储在tinyblob / tinytext(或更大)字段中。
这表明哪个更好?或者我可能要问:其中一个更好吗?如果答案是肯定的,哪个? 最后我应该如何使用PDO将密码存储到db。我以为我可以像文件一样将信息写入blob行,但如果从输入中获取值,必须使用哪种方法或函数? 你能解释一下吗?
答案 0 :(得分:10)
存储散列密码时,空白删除不是问题:
密码应使用现代且经过验证的key-stretching算法进行哈希处理,但不能使用SHA-256或MD5等加密哈希函数进行哈希处理。合适的算法包括PBKDF2,bcrypt或scrypt。
例如,使用bcrypt对字符串“pass phrase”进行哈希处理,并且可以生成新的盐
$2a$12$PuYHvYwgKeD.hQ1Dv6nLQuxUkv5zP3lYLPHqdMOzgwPVaGGSAs07u
`-----'`-----------······· ·········-------'
algorithm random salt password hash
parameters
整个字符串可以用作salt,因为实际的密码哈希将被切断而不能用作salt。
用于验证登录尝试的推荐工作流程:
建议设置新密码的工作流程:
进一步评论:
[1]这里,“明文”表示可打印的ASCII字符。它没有引用密码的明文。