我希望能够自动设置一个Web应用程序(即在cron运行中)向远程网站发送POST请求。远程网站需要用户名/密码组合作为POST数据的一部分发送。我希望Web应用程序能够发出远程网站的POST请求,而无需用户每次发出请求时都提供与POST数据一起发送的密码。
在我看来,执行此操作的唯一方法是将密码直接存储在数据库中,以便cron运行可以执行POST请求,该请求包含密码作为其POST数据的一部分。如果不以某种形式将密码存储在数据库中,似乎不可能在POST数据中提供密码,除非用户在每次请求时都提供密码。
问题1:我是否误解并以某种方式忽略了某些逻辑? 问题2:假设我必须将密码存储在数据库中,这样做最安全的程序是什么? (MD5和类似的单向加密显然不起作用,因为我必须在POST请求中发送未加密的密码。)
感谢您的帮助!
答案 0 :(得分:1)
一个。如果您不知道密码......您无法进行身份验证,那就是密码的想法!
湾如果您需要知道密码 - 您需要以可解密的方式保存密码 - 因此 - 安全性较低。
℃。如果您拥有该网站,则可以使用具有超长超时值的cookie,但是 - 您仍需要至少进行一次身份验证。
d。除非您正在守护金钱/火箭科学,否则您需要加密密码并将其存储在数据库中并在每次使用前对其进行解密,至少您要防止数据库被盗。
即确保您通过安全通道进行身份验证(如https),因此密码不会以明文形式发送。
答案 1 :(得分:0)
一个好的解决方案可能是使用SSL(即HTTPS)。您可以在服务器端创建证书颁发机构,然后让此证书颁发机构签署您生成的客户端证书。确保HTTP服务器配置为信任新创建的证书颁发机构。
完成此操作后,您应该在客户端安装证书。客户端在与HTTP服务器通信时必须提供证书。在POST到您的安全URL时,您必须将HTTP服务器配置为需要可信证书。
如何使用Apache HTTPD执行此操作的一个很好的示例已发布right here!
我链接的文档没有描述如何设置证书颁发机构和创建自签名证书,但有大量示例,例如here。
这是一个很好的解决方案,因为:
这里的关键是客户端正在向服务器提供其凭据,这与浏览器上下文中通常所做的相反。您还可以让客户端信任您新创建的证书颁发机构,以便它知道它正在与正确的服务器通信,而不是中间的人。
答案 2 :(得分:0)
鉴于您必须以明文形式发送密码并在没有用户交互的情况下重复执行,您需要从数据存储(文件/数据库/内存)存储和检索密码。
您真正需要考虑的是密码存储的最后一行安全性。
无论您是否对其进行加密都无关紧要。有权访问数据或密码密钥的人/程序将能够读取该密码。
将此问题排序,记录下来 - (这将成为您应用的安全策略),然后实施它。
安全只是您为降低风险而实施的难度级别。
答案 3 :(得分:0)
幸运的是,Tumblr现在实现了OAuth,解决了这个问题。