繁体   English   中英

如何在MySQL中安全地存储密码并通过外部服务进行身份验证

[英]How can I store password securely in MySQL and authenticate to external services

目前,我有一个PHP脚本,可通过IMAP连接到邮件服务器,并将新电子邮件解析为MySQL。 连接到邮件服务器的凭据使用纯文本存储在MySQL中,有没有办法加密存储在MySQL中的密码?

MySQL支持AES_ENCRYPT()函数。 您可以在将其插入数据库时​​进行加密,并在选择SELECT时将其解密。

阅读我链接的文档以获取示例。

然后,当您使用纯文本密码imap_open()时,请确保将端口993用于与IMAP服务器的TLS加密连接。

取决于电子邮件服务器需要认证的内容。 如果需要使用纯文本发送密码(可能是因为电子邮件服务器本身对其进行哈希处理),则应先对密码进行加密,然后再解密,然后再将其发送到电子邮件服务器。

如果您可以将哈希密码发送到服务器,请使用哈希函数(md5,sha1,sha512,...)对其进行哈希。

hash('sha1', $password);
sha1($password); // Same result as above.

如果必须加密(以便能够解密),则可以使用mcrypt或openssl。

http://php.net/manual/en/function.mcrypt-encrypt.php http://php.net//manual/en/function.openssl-encrypt.php

此处的区别在于无法散列哈希密码。 加密的密码可以解密。

哈希密码的目的是在数据库被黑客入侵的情况下确保最终用户的隐私和机密性。 显然,您不能使用哈希函数,因为您的脚本需要读回imap密码,因此您应该使用一些对称的加密函数(例如AES,河豚,3DES等)对其进行加密。 现在,您面临着将对称密钥材料存储在何处的问题:将其存储在同一数据库中完全是愚蠢的,因为黑客入侵数据库将意味着读取密钥。 您可以在脚本内部或外部txt文件中对密钥材料进行硬编码:现在,黑客应同时破坏mysql服务器和Web域以检索imap密码,这是使用标准php +可以达到的最高安全级别。 mysql通用域。

我使用这些功能或它们的某些变体进行登录。 它趋向于非常安全,因为它会对密码加盐并对其进行哈希处理。

<?php
function password_encrypt($password) {
        // Tells PHP to use Blowfish with a "cost" of 10
        $hash_format = "$2y$10$";
        // Blowfish salts should be 22-characters or more
        $salt_length = 22;
        $salt = generate_salt($salt_length);
        $format_and_salt = $hash_format . $salt;
        $hash = crypt($password, $format_and_salt);
        return $hash;
    }

    function generate_salt($length) {
        // Not 100% unique, not 100% random, but good enough for a salt
        // MD5 returns 32 characters
        $unique_random_string = md5(uniqid(mt_rand(), true));

        // Valid characters for a salt are [a-zA-Z0-9./]
        $base64_string = base64_encode($unique_random_string);

        // But not '+' which is valid in base64 encoding
        $modified_base64_string = str_replace('+', '.', $base64_string);

        // Truncate string to the correct length
        $salt = substr($modified_base64_string, 0, $length);

        return $salt;
    }

    function password_check($password, $existing_hash) {
        // existing hash contains format and salt at start
        $hash = crypt($password, $existing_hash);
        if ($hash === $existing_hash) {
        return true;
        } else {
        return false;
        }
    }

    function attempt_login($username, $password) {
        $admin = find_admin_by_username($username);
        if ($admin) {
            // found admin, now check password
            if (password_check($password, $admin["hashed_password"])) {
                // password matches
                return $admin;
            } else {
                // password does not match
                return false;
            }
        } else {
            // admin not found
            return false;
        }
    }
?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM