如何最好地将密码存储在 SQL 服务器中以便可以检索密码
How best to store a password in SQL Server so that the password can be retrieved
所以我正在创建一个应用程序,用于登录一长串 FTP 站点,检查新文件并下载它找到的任何新文件。
我正在使用 SQL Server 2016 SP1 来存储我已经下载的 table 个文件,所以当我连接到 FTP 并检查 table,我可以判断一个文件是否是 "new"。
我还使用 SQL 服务器来存储我的 FTP 站点列表、用户名和...密码!我的应用程序逐个循环遍历 FTP table 中的每个 FTP 站点,并使用 table 中的凭据连接到它们。
现在我将密码存储为 plan varchars,因为我需要将它们传递到我正在使用的 FTP 应用程序中。
我想做的是将它们存储为加密数据,这样我只在要使用密码时才解密。理想情况下,我只会将解密后的密码传递给内存中的 FTP 客户端,而不会将其作为 varchar 实际写入磁盘。
我遇到的每个指南或网页都在谈论加密密码,因此您只会得到哈希值,有效地为我提供了一种检查密码是否正确的方法,这对于 运行 具有密码,或者检查用户是否输入了正确的密码,等等。
我需要的是一种加密存储密码的方法,这样它就可以由我解密,这样我就可以使用它了。无论我沿着这些方向搜索什么,我总是不断返回给我散列检查的答案,而不是解密它的方法。
我想做的事可行吗?有什么意义吗?因为如果 I 可以解密密码,那么肯定任何有权访问数据库的人都可以吗?或者是否有某种方法可以有效地将它们锁定为仅由某些用户 ID 解密?
欢迎指教。
您可以加密存储您的密码,并能够使用许多不同的 public/private 或私钥加密方法(非对称或对称)(例如 RSA、AES 和 3DES)对其进行解密。但是,正如您在 post 末尾所述,这会带来安全风险,因为您需要保护使用强数据库权限访问数据和私钥来解密密码的能力。理想情况下,您应该只在存储密码时使用单向哈希,我建议您寻找一种替代解决方案,避免以其他方式存储它们(例如,您需要登录每个 FTP 站点吗?它取决于您要通过应用程序实现的目标。
如果您需要能够使用自动应用程序解密密码,请绝对确保解密后的密码永远不会写在任何地方,只存在于临时内存中,并确保解密所需的私钥是仅使用最少的必要权限进行保护。例如,您不应该有权访问生产私钥,只能访问 运行 可能应该 运行 在其自己的 Active Directory 帐户下的应用程序。
不确定您的应用程序使用的是哪种语言,但在 PHP 中,您可以使用 openssl 和 base64 方法来加密和解密服务器端。这是一个快速的 PoC:
<?php
$plaintext = 'plain text string to encrypt';
$password = 'Ir43234Ldsase445wsd4f';
$method = 'aes-256-cbc';
echo "Password:" . $password . "\n";
$key = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));
$ivlen = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($ivlen);
$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv));
$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $key, OPENSSL_RAW_DATA, $iv);
echo "plaintext=" . $plaintext . "\n";
echo "cipher=" . $method . "\n";
echo "encrypted to: " . $encrypted . "\n";
echo "decrypted to: " . $decrypted . "\n";
事实证明这是在浪费大量时间。我无法轻松地即时加密和解密,因此值得我花时间。这是可能的,但不值得我付出努力。
最后我只是安装了一个密码管理器并编写了密码请求脚本。到目前为止,比创建我自己的加密和解密例程更简单、更安全的解决方案。
所以我正在创建一个应用程序,用于登录一长串 FTP 站点,检查新文件并下载它找到的任何新文件。
我正在使用 SQL Server 2016 SP1 来存储我已经下载的 table 个文件,所以当我连接到 FTP 并检查 table,我可以判断一个文件是否是 "new"。
我还使用 SQL 服务器来存储我的 FTP 站点列表、用户名和...密码!我的应用程序逐个循环遍历 FTP table 中的每个 FTP 站点,并使用 table 中的凭据连接到它们。
现在我将密码存储为 plan varchars,因为我需要将它们传递到我正在使用的 FTP 应用程序中。
我想做的是将它们存储为加密数据,这样我只在要使用密码时才解密。理想情况下,我只会将解密后的密码传递给内存中的 FTP 客户端,而不会将其作为 varchar 实际写入磁盘。
我遇到的每个指南或网页都在谈论加密密码,因此您只会得到哈希值,有效地为我提供了一种检查密码是否正确的方法,这对于 运行 具有密码,或者检查用户是否输入了正确的密码,等等。
我需要的是一种加密存储密码的方法,这样它就可以由我解密,这样我就可以使用它了。无论我沿着这些方向搜索什么,我总是不断返回给我散列检查的答案,而不是解密它的方法。
我想做的事可行吗?有什么意义吗?因为如果 I 可以解密密码,那么肯定任何有权访问数据库的人都可以吗?或者是否有某种方法可以有效地将它们锁定为仅由某些用户 ID 解密?
欢迎指教。
您可以加密存储您的密码,并能够使用许多不同的 public/private 或私钥加密方法(非对称或对称)(例如 RSA、AES 和 3DES)对其进行解密。但是,正如您在 post 末尾所述,这会带来安全风险,因为您需要保护使用强数据库权限访问数据和私钥来解密密码的能力。理想情况下,您应该只在存储密码时使用单向哈希,我建议您寻找一种替代解决方案,避免以其他方式存储它们(例如,您需要登录每个 FTP 站点吗?它取决于您要通过应用程序实现的目标。
如果您需要能够使用自动应用程序解密密码,请绝对确保解密后的密码永远不会写在任何地方,只存在于临时内存中,并确保解密所需的私钥是仅使用最少的必要权限进行保护。例如,您不应该有权访问生产私钥,只能访问 运行 可能应该 运行 在其自己的 Active Directory 帐户下的应用程序。
不确定您的应用程序使用的是哪种语言,但在 PHP 中,您可以使用 openssl 和 base64 方法来加密和解密服务器端。这是一个快速的 PoC:
<?php
$plaintext = 'plain text string to encrypt';
$password = 'Ir43234Ldsase445wsd4f';
$method = 'aes-256-cbc';
echo "Password:" . $password . "\n";
$key = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));
$ivlen = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($ivlen);
$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv));
$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $key, OPENSSL_RAW_DATA, $iv);
echo "plaintext=" . $plaintext . "\n";
echo "cipher=" . $method . "\n";
echo "encrypted to: " . $encrypted . "\n";
echo "decrypted to: " . $decrypted . "\n";
事实证明这是在浪费大量时间。我无法轻松地即时加密和解密,因此值得我花时间。这是可能的,但不值得我付出努力。
最后我只是安装了一个密码管理器并编写了密码请求脚本。到目前为止,比创建我自己的加密和解密例程更简单、更安全的解决方案。