【问题标题】:Is this a safe implementation of mcrypt?这是 mcrypt 的安全实现吗?
【发布时间】:2013-04-12 18:34:16
【问题描述】:

我的 Web 应用程序需要连接到多个 FTP 服务器,我不希望 FTP 密码以纯文本形式存储。哈希不是一种选择,因为我需要双向加密。

这就是我基于 mcrypt 文档用 PHP 编写以下类的原因。它使用 mcrypt 来加密和解密纯文本。密码输入字段用作 $password 变量的输入。

当我使用 50 个字符的强密码加密文本时,我可以认为这种加密是安全的吗?

提前谢谢你。

class Crypto
{
    private $_iv_size, $_iv;

    function __construct()
    {
        $this->_iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
        $this->_iv = mcrypt_create_iv($this->_iv_size, MCRYPT_RAND);
    }

    function encrypt($plaintext, $password)
    {       
        $key = pack('H*', hash("SHA512", $password, true));
        $plaintext_utf8 = utf8_encode($plaintext);
        $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key,
        $plaintext_utf8, MCRYPT_MODE_CBC, $this->_iv);
        $ciphertext = $this->_iv . $ciphertext;
        $ciphertext_base64 = base64_encode($ciphertext);

        return $ciphertext_base64;
    }

    function decrypt($ciphertext_base64, $password)
    {
        $key = pack('H*', hash("SHA512", $password, true));
        $ciphertext_dec = base64_decode($ciphertext_base64);
        $iv_dec = substr($ciphertext_dec, 0, $this->_iv_size);
        $ciphertext_dec = substr($ciphertext_dec, $this->_iv_size);
        $plaintext_utf8_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key,
        $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);

        return $plaintext_utf8_dec;
    }
}

【问题讨论】:

    标签: php encryption security


    【解决方案1】:

    是的,AFAICS(1) 代码应该保护有效载荷。

    由于您是从密码中获取用于加密的密钥,因此在您的代码中只实现一次会更简洁(即使它只有一行)。但是明显的 WTF 是您通过所有这些麻烦来保护以明文形式发送到 FTP 服务器的 FTP 密码!

    1 - 无法证明代码是安全的或没有错误的

    【讨论】:

    • 谢谢,我同意不可能证明安全性。但是暴力破解需要一段时间,不是吗?这些密码将以加密格式存储在数据库中。 FTP 服务器都在本地可信网络上;密码不是通过互联网以明文形式发送的,所以我不需要害怕 MITM 攻击。但我确实希望安全地存储密码,以防有人接触到数据库。
    猜你喜欢
    • 2021-05-12
    • 2018-10-26
    • 1970-01-01
    • 2010-12-10
    • 2013-12-02
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多