我有一个加密类来加密用户的密码,最终结果是二进制字符串。
我想将此保存为MySQL作为用户的密码,但由于MySQL不能很好地处理二进制数据,我想将其转换为更加数据库友好的格式。
只要事先使用bin2hex
或base64_encode
以及hex2bin
或base64_decode
,我似乎能够加密/解密从MySQL中保存和提取值。之后。
我的问题是,如果有任何理由我应该选择一个而不是另一个?是否比另一个更可靠?是否比另一个更快?
谢谢。
答案 0 :(得分:2)
您应该在数据库中使用BINARY
或VARBINARY
类型以及要插入的预准备语句。然后你根本不需要做任何转换。据我所知,它是所有世界中最好的。线路上的数据大小将是紧凑的,并且在存储或php脚本中不会使用额外的内存。
答案 1 :(得分:1)
存储用户密码是bad的想法。 最好是散列用户密码并存储散列。
password_hash($password, PASSWORD_DEFAULT)
该函数返回一个可以简单存储在数据库中的字符串。
验证它:
if (password_verify($userPassword, $hash)) {
// Login successful.
}
另请参阅this paragon网站,了解使用libsodium(present in php 7.2+)的更安全的密码哈希方法:
// Password hashing:
$hash_str = \Sodium\crypto_pwhash_str(
$password,
\Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
\Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);
// Password verification:
if (\Sodium\crypto_pwhash_str_verify($hash_str, $password)) {
// recommended: wipe the plaintext password from memory
\Sodium\memzero($password);
// Password was valid.
} else {
// recommended: wipe the plaintext password from memory
\Sodium\memzero($password);
// Password was invalid.
}