Secure credential storage in python
在凭证存储环境中,一个可能的威胁模型是攻击者,它能够:
- 检查任何(用户)进程内存
- 读取本地(用户)文件
对于这种类型的攻击,人们的共识是不可能预防(因为凭证必须存储在内存中,程序才能实际使用它们),但有一些技术可以缓解这种攻击:
- 最小化敏感数据存储在内存中的时间
- 一旦不再需要数据,立即覆盖内存
- 通过模糊措施管理内存中的数据、继续移动数据和其他安全性
尤其是Python
第一种技术很容易实现,可能通过一个键环实现(希望是内核空间存储)
据我所知,如果不编写一个C模块,第二个模块根本无法实现(但我希望在这里被证明是错误的,或者有一个现有模块的列表)。
第三个问题很棘手。
尤其是,Python是一种具有非常强大的自省和反射功能的语言,很难阻止任何能够在解释器过程中执行Python代码的人访问凭证。
似乎有一种共识,那就是没有办法强制使用私有属性,而且这种尝试充其量也会激怒其他使用您的代码的程序员。
问题考虑到所有这些,如何使用python安全地存储身份验证凭证?最佳实践是什么?"一切都是公共的"这一语言的哲学可以做些什么吗?我知道"我们在这里都是同意的成年人",但我们是否应该被迫在与攻击者共享密码和使用其他语言之间做出选择?
存储身份验证凭据有两个截然不同的原因:好的。
在第一种情况下,不应存储密码(或密码的加密版本)。相反,您应该使用高质量的salt散列密码,并确保您使用的散列算法计算成本很高(以防止字典攻击),如pbkdf2或bcrypt。更多详细信息,请参见Salted密码散列-正确操作。如果您遵循这种方法,即使黑客检索到了加盐的、缓慢散列的令牌,他们也不能用它做很多事情。好的。
在第二种情况下,有许多事情可以使秘密发现变得更加困难(如您在问题中所概述的),例如:好的。
- 将机密加密到需要时,按需解密,然后在需要时立即重新加密
- 使用地址空间随机化,因此每次应用程序运行时,密钥都存储在不同的地址
- 使用操作系统密钥库
- 使用"硬"语言,如C/C++,而不是基于VM的内省语言,如Java或Python。
这种方法当然比什么都没有要好,但熟练的黑客迟早会破坏它。好的。令牌
从理论上讲,认证是证明被挑战者是他们所说的人的行为。传统上,这是通过共享秘密(密码)实现的,但还有其他方法可以证明自己,包括:好的。
- 带外认证。例如,在我居住的地方,当我试图登录我的网上银行时,我会在手机上收到一个一次性密码(otp)作为短信息。在这种方法中,我通过拥有一个特定的电话号码来证明我
- 安全令牌:要登录到服务,我必须按下令牌上的一个按钮以获取一个OTP,然后将其用作我的密码。
其他设备:好的。
- 智能卡,特别是美国国防部使用的智能卡,称为CAC。python有一个名为pyscard的模块来与此接口
- NFC设备
这里还有一个更完整的清单好的。
所有这些方法之间的共同点是,最终用户控制这些设备,而秘密实际上从未离开令牌/卡/电话,当然也从未存储在您的程序中。这使它们更加安全。好的。会话窃取
但是(总是有一个但是):好的。
假设您设法保护登录,这样黑客就无法访问安全令牌。现在,您的应用程序正愉快地与安全服务进行交互。不幸的是,如果黑客可以在您的计算机上运行任意的可执行文件,那么黑客可以劫持您的会话,例如通过向您的有效使用服务中注入额外的命令。换句话说,虽然您已经保护了密码,但这完全无关紧要,因为黑客仍然可以访问"安全"资源。好的。
这是一个非常真实的威胁,正如多个跨站点脚本攻击所显示的那样(一个例子是美国银行和美国银行的网站容易受到攻击,但还有无数其他网站)。好的。安全代理
如上所述,将帐户的凭据保存在第三方服务或系统上是一个基本问题,这样应用程序就可以登录到该帐户,特别是当唯一的登录方法是用户名和密码时。好的。
一种方法是将通信委托给安全代理,并在应用程序和代理之间开发安全登录方法,从而部分缓解这一问题。在这种方法中好的。
- 应用程序使用PKI方案或双因素身份验证登录到安全代理
- 用户将安全凭据添加到安全代理的第三方系统。凭据从不存储在应用程序中
- 稍后,当应用程序需要访问第三方系统时,它会向代理发送请求。代理使用安全凭据登录并发出请求,将结果返回到应用程序。
这种方法的缺点是:好的。
- 用户可能不希望信任存储凭据的安全代理
- 用户可能不信任安全代理,因为数据通过它流向第三方应用程序。
- 应用程序所有者拥有运行代理所需的额外基础结构和托管成本。
一些答案
因此,对于具体的答案:好的。
How does one securely store authentication credentials using python?
Ok.
- 如果存储应用程序的密码以对用户进行身份验证,请使用pbkdf2算法,例如https://www.dlitz.net/software/python-pbkdf2/
- 如果存储密码/安全令牌以访问另一个服务,那么就没有绝对安全的方法。
- 但是,考虑将身份验证策略切换到,例如智能卡,使用,例如pyscard。您可以使用智能卡对应用程序的用户进行身份验证,也可以使用X.509证书对另一个服务的应用程序进行安全身份验证。
< Buff行情>
"一切都是公共的"这一语言的哲学可以做些什么吗?我知道"我们在这里都是同意的成年人",但我们是否应该被迫在与攻击者共享密码和使用其他语言之间做出选择?好的。< /块引用>
imho在python中编写一个特定的模块没有任何错误,它最该死的做法是隐藏机密信息,使它成为其他人重用的正确bugger(这是它的目的,这会让其他程序员感到恼火)。甚至可以用C编写大部分代码并链接到它。但是,由于明显的原因,不要在其他模块中这样做。好的。
但是,最终,如果黑客控制了计算机,那么计算机上就没有任何隐私。理论上最坏的情况是,你的程序运行在一个虚拟机上,黑客可以完全访问计算机上的所有内存,包括BIOS和图形卡,并且可以通过身份验证引导你的应用程序发现它的秘密。好的。
由于没有绝对的隐私权,剩下的只是模糊,保护级别只是模糊的难易程度,而熟练的黑客对信息的需求程度。我们都知道这是如何结束的,即使是定制硬件和十亿美元的产品。好的。
Using Python keyring
Ok.
虽然这将非常安全地管理与其他应用程序相关的密钥,但是所有Python应用程序都共享对令牌的访问。这对你担心的攻击类型一点也不安全。好的。好啊。
我不是这个领域的专家,我只是想解决和你一样的问题,但看起来像哈希科普的金库可以很好地解决问题。
尤其是关于存储第三方服务凭证的问题。例如。:
In the modern world of API-driven everything, many systems also support programmatic creation of access credentials. Vault takes advantage of this support through a feature called dynamic secrets: secrets that are generated on-demand, and also support automatic revocation.
For Vault 0.1, Vault supports dynamically generating AWS, SQL, and Consul credentials.
更多链接:
- github
- 跳马网站
- 用例