【问题标题】:Secure plaintext passwords on a database [duplicate]数据库上的安全明文密码[重复]
【发布时间】:2023-03-27 21:44:02
【问题描述】:

出于内部原因,我需要将第 3 方帐户的密码存储在数据库中,因此我无法真正使用哈希,因为我无法轻松地从中恢复密码。

有没有办法加密明文密码,这样潜在的黑客即使有 mysql 表也无法轻松检索密码,但我仍然可以解密它以查看其原始形式?

【问题讨论】:

  • 为什么需要能够找回密码?!
  • 因为这些是第 3 方网站上的帐户,我需要能够在需要时登录它们。
  • 您绝对不需要登录陌生人的帐户。我绝对不想那样。如果您可以解密密码,那么黑客也可以。只有通过散列密码才能安全存储密码(使用强大的散列算法,如 BCrypt 或 Argon2i)。
  • 请不要假设每个人都是罪犯!我只想为关键帐户创建自己的密码管理器,因为我不信任像 lastpass 这样的其他人。因为他们安全地存储了明文密码,所以它必须是可能的。

标签: php mysql passwords password-protection password-encryption


【解决方案1】:

解密密码不是最佳做法。但是,如果您的要求是 比简单地使用字符串的任何加密或解密方法。

我最近使用下面的函数来加密或解密字符串。用于保护 URL。您还可以在使用 GET 方法请求时使用此加密或解密功能来保护 url。

<?php
define("ENCRYPTION_KEY", "ABCDEFGHIJKLabcdefghijklm!@#$%^&*");
$string = "Plain Text";

echo $encrypted = encrypt($string, ENCRYPTION_KEY);
echo "<br />";
echo $decrypted = decrypt($encrypted, ENCRYPTION_KEY);

// this function will return encrypted string
function encrypt($pure_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
    return $encrypted_string;
}

// this function will return encrypted string
function decrypt($encrypted_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);
    return $decrypted_string;
}
?>

因此,出于您的目的,使用此加密函数将纯文本存储在数据库中 并使用另一个函数检索它。

【讨论】:

  • ECB模式实际上从来都不是一个好的选择,它根本不使用IV,所以mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)的结果总是为零。
  • 你建议使用什么?
猜你喜欢
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2015-08-27
  • 2011-03-09
相关资源
最近更新 更多