Sql server 如何最好地在SQL Server中存储密码,以便检索密码

Sql server 如何最好地在SQL Server中存储密码,以便检索密码,sql-server,encryption,passwords,sql-server-2016,Sql Server,Encryption,Passwords,Sql Server 2016,因此,我正在创建一个应用程序,它可以登录一长串FTP站点,检查新文件并下载找到的任何新文件 我使用SQL Server 2016 SP1存储我已经下载的文件表,因此当我连接到FTP并检查该表时,我可以判断文件是否为“新”文件 我还使用SQL Server存储我的FTP站点、用户名和。。。密码!我的应用程序逐个遍历FTP表中的每个FTP站点,并使用表中的凭据连接到它们 现在我将密码存储为plan varchars,因为我需要将它们传递到我正在使用的FTP应用程序中 我想做的是将它们存储为加密数据,

因此,我正在创建一个应用程序,它可以登录一长串FTP站点,检查新文件并下载找到的任何新文件

我使用SQL Server 2016 SP1存储我已经下载的文件表,因此当我连接到FTP并检查该表时,我可以判断文件是否为“新”文件

我还使用SQL Server存储我的FTP站点、用户名和。。。密码!我的应用程序逐个遍历FTP表中的每个FTP站点,并使用表中的凭据连接到它们

现在我将密码存储为plan varchars,因为我需要将它们传递到我正在使用的FTP应用程序中

我想做的是将它们存储为加密数据,这样我只有在即将使用密码时才能解密密码。理想情况下,我只将解密后的密码传递给内存中的FTP客户端,而不会将其作为varchar写入磁盘

我遇到的每一个指南或网页都谈到加密密码,所以你只能得到散列,有效地给了我一种方法来检查我是否有正确的密码,这对于使用密码运行网站很有用,或者检查用户是否正确输入了密码,或者诸如此类

我需要的是一种加密存储密码的方法,这样我就可以对密码进行解密,这样我就可以使用它了。无论我沿着这些路线搜索什么,我总是返回给我哈希检查的答案,而不是解密它的方法

我想做的事可能吗?有什么意义吗?既然我能解密密码,那么任何有权访问数据库的人都能?或者是否有某种方法可以有效地将它们锁定为只能由某些用户ID解密


欢迎您的建议。

您可以存储加密的密码,并可以使用多种不同的公开/私有或私钥加密方法(不对称或对称)对其进行解密,如RSA、AES和3DES。但是,正如您在文章末尾所述,这会带来安全风险,因为您需要使用对数据的强数据库访问权限和私钥来保护解密密码的能力。理想情况下,您应该在存储密码时只使用单向散列,我建议您搜索另一种解决方案,以避免以其他方式存储密码(例如,您是否需要登录到每个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";

事实证明这是在浪费时间。我不能轻易地在飞行中加密和解密,这样我的时间就值得了。这是可能的,但不值得付出努力


最后,我安装了一个密码管理器,并编写了密码请求脚本。到目前为止,这是比创建自己的加密和解密例程更简单、更安全的解决方案。

您用什么语言编写应用程序?如果您需要加密某些内容并能够检索值,则需要使用密钥和证书对其进行加密。但是,如果您试图存储密码供个人使用,那么使用某种密码管理软件不是更好吗?我建议您将加密密码存储在SQL Server中的唯一一次是实例本身在自动任务中出于某种原因需要加密密码。最好的方法是设置FTP连接以进行证书身份验证。如果不可能,您需要支持透明数据加密的Sql Server版本。如果您只关心将密码传递到内存中的FTP等,那么您还应该关心FTP通过网络以明文形式发送密码。目前,我正在使用Visual Basic为我的应用程序。一般来说,我连接到的站点是SFTP而不是FTP,因此在发送到服务器时应该加密密码。我有一个密码管理器Crypto,但编写脚本很难。我可能被迫学习如何编写脚本…这不是一个答案,只是一个关于安全性的模糊警告。不是PHP。如果可能的话,我想在SQL Server中处理加密和解密。也许这就是您想要的。