我正在编写一个交易应用程序使用Node & Express作为后端。每个用户都有自己的应用程序登录,但为了使其有用,应用程序还需要登录到用户的代理帐户。
所讨论的经纪帐户有一个REST,您可以在其中发布该系统的登录名和密码。该API不提供SSO或OAuth作为身份验证的选项。唯一的身份验证方法是POSTing、uid和密码。
因此这里涉及两个登录:一个登录到我的应用程序,另一个单独登录到经纪帐户。每个登录都使用不同的用户ID和密码。
我遇到的问题是如何存储经纪账户的密码。我知道存储密码是个坏主意。但是,如果我所存储的只是经纪密码的盐渍散列,我将无法逆转它并获得实际的密码。因此,除非用户再次输入密码,否则我的应用程序将无法登录到代理帐户。
(顺便说一句,还有另一个程序可以做到这一点。https://dough.com要求用户登录到面团,然后您还必须登录到TD Ameritrade。两次登录是我希望避免的。)
是否有一种合理和安全的方式来存储这个第三方API的密码,以便我的应用程序可以代表用户登录,而不必强迫用户每次使用我的应用程序时都提交密码?我知道这里有很大的安全风险。如果答案是否定的,那我就不会。
发布于 2016-10-17 00:25:27
编辑&强制性的--真正的解决方案是不要这样做。虽然在技术上是可行的,但它几乎肯定不会被正确实现&它将公开用户的密码。
是的,但这并不容易&实现是关键。JavaScript OpenPGPJS library是你想要的。
为了在某种程度上保证系统安全,不能允许后端解密密码。这就是JS库进来的地方,它通过浏览器提供PGP密码。
您可以将PGP密码从用户密码中删除,或者让它们提供一个新的解密密码。或者,您可以为密码加密生成随机密钥,然后创建一个具有访问随机密钥的主密钥--使用用户输入对主密钥进行加密。
无论您使用哪种方法,您都需要让它们输入密码,以便在需要时解密记录,或者将它们的密码添加到本地会话中。前者是安全的,后者具有明显的安全含义。
使用密码进行简单字符串加密,如示例所提供:
var options, encrypted;
options = {
data: 'Hello, World!', // input as String
passwords: ['secret stuff'] // multiple passwords possible
};
openpgp.encrypt(options).then(function(ciphertext) {
encrypted = ciphertext.data; // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
});解密:
options = {
message: openpgp.message.readArmored(encrypted), // parse armored message
password: 'secret stuff' // decrypt with password
};
openpgp.decrypt(options).then(function(plaintext) {
return plaintext.data; // 'Hello, World!'
});发布于 2016-10-17 01:06:36
我认为你有几个选择,你选择的决定应该取决于你想要承担的风险。如果像你暗示的那样是财务数据,我认为这个决定显然不应该这样做。
一种选择是将第三方API密码存储在您的服务器上,该密码使用从用户本地密码派生的密钥加密。由于您不存储用户的本地密码,因此您只能在用户登录时对第三方API密码进行解密,而从那里开始,如果您希望将来调用模拟用户的API,则必须将第三方密码的明文版本保存在服务器内存(用户会话)中。我认为,虽然在某些应用程序中,这可能是一个可行的选择,但对于财务数据而言,这是不可接受的。
您可以做的另一件事是加密Javascript中的第三方API密码,正如Dave在他的回答中所描述的那样。虽然这是可行的,但它增加了许多复杂性,正如他还指出的那样,实现将是关键。如果不引入漏洞,就很难做到这一点,并随着时间的推移进行维护。而且Javascript密码也有它的问题,最好的做法是不要在Javascript中做密码学。您必须将第三方API密码保存在Javascript内存中,这是一个非常弱的控制,任何一个XSS都可以从其中窃取它(任何其他浏览器存储甚至比内存中的Javascript对象还要糟糕)。另外,第三方API需要支持来自您的域(或者*显然)的CORS。
我的看法是,要做到这一点,唯一好的方法就是使用OAuth2进行仔细的实现。如果API不支持这一点,那么不幸的是您不应该这样做。
https://stackoverflow.com/questions/40076838
复制相似问题