[英]Secure credential storage in python
在凭证存储的情况下,一种可能的威胁模型是攻击者,它具有以下能力:
AFAIK,这种攻击的共识是无法阻止(因为必须将凭据存储在内存中,程序才能实际使用它们),但是有两种技术可以缓解这种攻击:
第一种技术很容易实现,可能通过密钥环 (希望是内核空间存储)来实现
就我所知,不编写C模块根本无法实现第二个(但是我很乐意在这里被证明是错误的,或者希望有一个现有模块的列表)
第三个是棘手的。
特别是,由于python是具有强大的自省和反射功能的语言,因此很难阻止能够在解释器过程中执行python代码的任何人访问凭据。
似乎已经达成共识, 那就是无法强制执行私有属性 ,而尝试进行 私有属性 充其量只会使其他正在使用您的代码的程序员烦恼 。
考虑到所有这些,如何使用python安全地存储身份验证凭据? 最佳做法是什么? 关于“一切都是公共的”哲学这个语言,可以做些什么吗? 我知道“我们所有人都同意这里的成年人” ,但是我们是否应该被迫在与攻击者共享密码和使用另一种语言之间进行选择?
为什么要存储身份验证凭据,有两个非常不同的原因:
在第一种情况下,您永远不要存储密码(或密码的加密版本)。 相反,您应该使用高质量的盐对密码进行哈希处理 ,并确保所使用的哈希算法在计算上昂贵(以防止字典攻击),例如PBKDF2或bcrypt。 有关更多详细信息,请参见腌制密码哈希-正确执行。 如果您采用这种方法,即使黑客检索到盐渍,哈希值低的令牌,他们也不会做太多事情。
在第二种情况下,有许多事情使秘密发现变得更加困难(正如您在问题中所概述的),例如:
这样的方法肯定总比没有好,但是熟练的黑客迟早会破解它。
从理论上讲,认证是证明被挑战者就是他们所说的人的行为。 传统上,这是通过共享机密(密码)实现的,但是还有其他方式可以证明自己,包括:
其他设备:
而一个更完整的列表在这里
所有这些方法之间的共同点是,最终用户控制这些设备,并且秘密永远不会真正离开令牌/卡/电话,并且肯定不会存储在您的程序中。 这使它们更加安全。
但是(总是有一个):
让我们假设您设法保护登录名的安全,以便黑客无法访问安全令牌。 现在,您的应用程序很高兴与安全服务进行交互。 不幸的是,如果黑客可以在您的计算机上运行任意可执行文件,则黑客可以例如通过向服务的有效使用中注入其他命令来劫持您的会话。 换句话说,虽然您已经保护了密码,但是这完全无关紧要,因为黑客仍然可以访问“安全”资源。
正如多种跨站点脚本攻击所显示的那样,这是一个非常现实的威胁(一个示例是“ 美国银行”和“美国银行网站易受攻击” ,但还有更多的此类威胁)。
如上所述,存在一个基本问题,即在第三方服务或系统上保留帐户凭据,以便应用程序可以登录到该帐户,尤其是在唯一的登录方法是用户名和密码的情况下。
通过将与服务的通信委托给安全代理来部分缓解此问题的一种方法,并在应用程序和代理之间开发一种安全的登录方法。 用这种方法
这种方法的缺点是:
因此,针对特定答案:
如何使用python安全地存储身份验证凭据?
关于“一切都是公共的”哲学这个语言,可以做些什么吗? 我知道“我们所有人都同意这里的成年人”,但是我们是否应该被迫在与攻击者共享密码和使用另一种语言之间进行选择?
恕我直言,用Python编写一个特定的模块并没有什么错,因为它确实可以隐瞒秘密信息,这使它成为供其他人重用的正确工具(讨厌其他程序员是其目的 )。 您甚至可以用C编写大部分代码并链接到它。 但是,出于明显的原因,请勿对其他模块执行此操作。
但是,最终,如果黑客控制了计算机,则计算机上根本没有隐私。 从理论上讲,最坏的情况是您的程序正在VM中运行,黑客可以完全访问计算机上的所有内存,包括BIOS和图形卡,并且可以通过身份验证来逐步执行您的应用程序以发现其秘密。
在没有绝对隐私的情况下,剩下的只是混淆,而保护的级别就是混淆的难易程度与熟练的黑客想要多少信息。 众所周知,即使对于定制硬件和价值十亿美元的产品 ,这也是如何结束的 。
使用Python密钥环
尽管这将相当安全地管理其他应用程序的密钥,但所有Python应用程序都共享对令牌的访问。 对于您担心的攻击类型,这一点也不安全。
我不是该领域的专家,我只是想解决您所遇到的同样问题,但是看起来像Hashicorp的Vault之类的东西也许可以很好地帮助您。
特别是WRT,涉及到存储第三部分服务的凭证的问题。 例如:
在现代的API驱动的世界中,许多系统还支持以编程方式创建访问凭据。 保管箱通过一种称为动态机密的功能来利用此支持:动态机密是按需生成的,并且还支持自动吊销。
对于Vault 0.1,Vault支持动态生成AWS,SQL和Consul凭证。
更多链接:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.