【问题标题】:Displaying Encrypted Passwords in PHP在 PHP 中显示加密密码
【发布时间】:2013-04-23 22:37:12
【问题描述】:

我正在构建网站的客户在其“仅限会员”部分使用密码/促销代码,允许会员访问特殊内容。我通过 MySQL 存储上述密码,使用 sha1 加密。

客户端需要在管理员控制面板中以纯文本形式查看这些密码。显然这不是使用 sha1 的选项。

在加密数据库中的密码与存储纯文本之间有什么权衡?我是否应该简单地将它们以纯文本形式存储在数据库中,然后在帖子中加盐?

在保持适当安全级别的同时显示纯文本密码的最佳方法是什么?

【问题讨论】:

  • 你可以使用加密算法(而不是像 sha1 这样的散列函数),它们是可逆的
  • 我喜欢这个想法@DamienPirsy,虽然我对(自定义?)算法没有什么经验。我所说的“密码”将被多个成员同时使用,通过邮件列表等方式发送出去。

标签: php mysql encryption passwords sha1


【解决方案1】:

不显示密码。只需为客户端提供以其他用户身份登录的能力(我认为这就是他们需要密码的原因吗?)也许是在一个页面上,该页面本身受密码保护,只有客户端知道。

【讨论】:

  • +1 找出您的客户想要这样做的原因,并为他们提供另一种方式来做他们想做的事。他们不应该需要查看其用户的密码 - 也不应允许他们查看,因为这可能会导致隐私泄露到其他地方的客户帐户。
  • 客户创建促销代码,同时通过电子邮件发送给许多成员。此代码(密码)在网站上用于访问特殊内容。密码必须通过管理控制面板可见,以供客户参考。
  • @mrtwidget 我想你说的是完全独立于用户名/密码登录的东西。哇,这肯定需要更清楚,因为那根本不是密码。事实上,你为什么要费心加密它?
【解决方案2】:

您应该向您的客户解释为什么他们必须无权访问密码。很多事情都可能出错。被盗数据库,流氓用户,错过 SQL 注入攻击,这不值得冒险。

【讨论】:

  • 会员密码只允许访问会员内容。不会将敏感信息传递给普通会员。
【解决方案3】:

这个可以。

<?php
    # --- ENCRYPTION ---

    # the key should be random binary, use scrypt, bcrypt or PBKDF2 to
    # convert a string into a key
    # key is specified using hexadecimal
    $key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");

    # show key size use either 16, 24 or 32 byte keys for AES-128, 192
    # and 256 respectively
    $key_size =  strlen($key);
    echo "Key size: " . $key_size . "\n";

    $plaintext = "This string was AES-256 / CBC / ZeroBytePadding encrypted.";

    # create a random IV to use with CBC encoding
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

    # use an explicit encoding for the plain text
    $plaintext_utf8 = utf8_encode($plaintext);

    # creates a cipher text compatible with AES (Rijndael block size = 128)
    # to keep the text confidential 
    # only suitable for encoded input that never ends with value 00h
    # (because of default zero padding)
    $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
                                 $plaintext_utf8, MCRYPT_MODE_CBC, $iv);

    # prepend the IV for it to be available for decryption
    $ciphertext = $iv . $ciphertext;

    # encode the resulting cipher text so it can be represented by a string
    $ciphertext_base64 = base64_encode($ciphertext);

    echo  $ciphertext_base64 . "\n";

    # === WARNING ===

    # Resulting cipher text has no integrity or authenticity added
    # and is not protected against padding oracle attacks.

    # --- DECRYPTION ---

    $ciphertext_dec = base64_decode($ciphertext_base64);

    # retrieves the IV, iv_size should be created using mcrypt_get_iv_size()
    $iv_dec = substr($ciphertext_dec, 0, $iv_size);

    # retrieves the cipher text (everything except the $iv_size in the front)
    $ciphertext_dec = substr($ciphertext_dec, $iv_size);

    # may remove 00h valued characters from end of plain text
    $plaintext_utf8_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key,
                                         $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);

    echo  $plaintext_utf8_dec . "\n";
?>

来源:http://www.php.net/manual/en/function.mcrypt-encrypt.php

【讨论】:

    【解决方案4】:

    您可以使用双向加密来存储和显示密码。 mcrypt_encrypt()mcrypt_decrypt。看这个问题Simplest two-way encryption using PHP

    【讨论】:

      【解决方案5】:

      不要这样做。寻找替代路线。

      如果您的客户出于某种原因想要查看其用户的密码,请询问他们为什么要查看这些密码,以及如果他们有这些密码会做什么 - 然后为他们提供另一种直接的方法,这从不需要知道用户的密码是什么。

      无论您的客户使用多么无辜或微不足道,大多数人在任何地方都重复使用他们的密码。您的客户可能会认为他们只知道自己系统的用户密码,但这意味着他们现在可能知道用户一切的密码 - 电子邮件、网上银行等金融服务等。

      只要一名恶意员工和一名用户的帐户在互联网上的其他地方被入侵。除了某人的隐私被侵犯的事实之外,这可能是一个相当合法的泥潭。

      寻找替代方案。永远不要以纯文本形式显示用户密码。

      【讨论】:

      • 完全同意这个答案。此外,您应该更改为像 BCrypt 这样的慢速密钥派生函数,SHA-* 系列的算法对于散列密码来说太快了。
      【解决方案6】:

      它是使用 SHA1 存储的,因此无法以明文形式检索它,因为 SHA1 是单向哈希。您无法将其转换为原始形式。 http://php.net/manual/en/function.sha1.php

      因此,您可以选择 md5 格式,也可以将它们作为纯文本存储在数据库中,然后在帖子中加盐

      【讨论】:

        猜你喜欢
        • 2014-10-06
        • 2012-05-06
        • 1970-01-01
        • 2016-03-14
        • 2017-11-09
        • 2017-04-11
        • 1970-01-01
        • 2014-03-26
        • 1970-01-01
        相关资源
        最近更新 更多