【问题标题】:Saving binary data to MySQL- bin2hex vs base64_encode将二进制数据保存到 MySQL-bin2hex vs base64_encode
【发布时间】:2015-08-30 13:03:22
【问题描述】:

我有一个加密类来加密用户的密码,最终结果是一个二进制字符串。

我想将此作为用户密码保存到 MySQL,但由于 MySQL 不能很好地处理二进制数据,我想将其转换为对数据库更友好的格式。

只要我事先使用bin2hexbase64_encode 并随后使用hex2binbase64_decode,我似乎能够很好地加密/解密从MySQL 保存和提取值。

我的问题是,我应该有什么理由选择其中之一吗?任何一个比另一个更可靠吗?任何 1 都比另一个快吗?

谢谢。

【问题讨论】:

  • 关于 bin2hex stackoverflow.com/questions/2558453/…bin2hex 可能使用比 base64 操作更多的内存,但是由于填充,base64 字符串可能会更长。您应该进行本地研究并测量内存使用和执行时间的差异。
  • @DeDee Base64 每个字符 6 位,而十六进制每个字符只有 4 位。除非您最多只编码 2 个字节,否则 Base64 总是比十六进制短。

标签: php


【解决方案1】:

您应该在数据库中使用BINARYVARBINARY 类型并插入准备好的语句。然后你根本不需要做任何转换。据我所知,这是世界上最好的。线路上的数据大小将是紧凑的,并且不会在存储或您的 php 脚本中使用额外的内存。

【讨论】:

  • VARBINARY 的最大长度与 MEDIUMTEXT 的最大长度怎么样?
【解决方案2】:

存储用户密码是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.
}

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 2011-02-03
    • 2011-07-03
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多