我正在考虑存储安全数据的最安全的方法(例如。信用卡号码),并要求将它们以明文形式发送给第三方API (这样哈希就不会起作用)。
我找到的解决方案似乎比典型的“当您必须使用相同的密钥使用它们时存储加密和解密”更安全。
其思想是对其进行加密,并将其直接存储在应用服务器上,然后使用公钥从用户那里获取它。
私钥根本不会存储在应用服务器上。相反,应用服务器将使用加密的值将消息发送到第三方API。
解决方案的第二部分是一个单独服务器上的HTTP代理,它将消息路由到第三方API并解密加密的值。私钥将只存储在代理上,而不会存储在磁盘上(只存储在RAM中-每次重新启动都需要输入私钥)。
似乎,使用代理作为一个黑匣子,在应用程序开发之后不需要更改,这将有助于比应用程序服务器(更多的人必须访问该服务器)更好地保护它。此外,由于不将私钥存储在磁盘上的要求,每次重新启动代理服务器后输入密钥都不会遇到这样的问题,因为它不需要像应用服务器机器那样频繁地重新启动。
对这一解决方案的利弊有何看法?是否有任何应用程序可以帮助我实现它(能够使用自定义转换代码的代理,在RAM中安全存储值的方法)?
发布于 2012-06-06 04:20:37
引用空手道小子的话说,“记住,最好的一块不是在那里”。(感谢比尔·切斯威克的这句话。)换句话说,安全存储信用卡的最安全的方法是.(等待.)别把它藏起来。使用第三方信用卡处理器为您存储信用卡号码,这样您就不必这样做了。他们可能会给你一个你可以用的手柄。
或者,您可以构建自己的服务。使用其他代码不知道的加密密钥,构建一个简单的代理,将信用卡号码安全地存储在自己的数据库中。代理可以提供一个API。当用户注册他们的帐户时,您将他们的信用卡号码发送到代理以进行存储。当用户付款时,您向代理发送一条消息:“向用户xyz的信用卡收取27美元”,代理负责检索信用卡号码并使用您的信用卡处理器启动交易。加强您用来存储信用卡号码的服务,并考虑启动一些限制利率或审核程序。这样,如果您的其余代码被破坏,至少攻击者不能窃取您的所有用户的信用卡号码。
另见如何创建不以纯文本存储凭据而自动登录到第三方服务的服务? 它询问如何安全地存储密码,但您可以将相同的技术应用于信用卡号码的存储。、储存信用卡号码和存储用于自动支付的信用卡?。
发布于 2012-06-06 06:23:17
一种更好的方法可能是使用HSM设备将用户信用卡数据加密到单独的数据库中。许多HSM为您提供了数据库列级加密功能,在开发安全模块时可以轻松到非常高的级别。您不需要有非对称密钥,而是HSM可以为每个用户生成对称密钥,这些密钥将由HSM的安全世界保护。在此基础上,为了具有较高的安全性,您可以使用最终用户(持卡人)创建的质询短语来保护加密数据。SSL隧道可以通过HSM直接完成,以验证挑战。这样,基础设施就不会知道挑战和用户卡的细节了。
https://security.stackexchange.com/questions/15678
复制相似问题