安全证书存储在python(Secure credential storage in python)

2019-07-19 02:37发布

攻击

一个可能的威胁模型,在证书存储的情况下,是有能力攻击者:

  • 检查任何(用户)处理存储器
  • 读取本地(用户)文件

据我所知,对这种类型的攻击的共识是,这是不可能的,以防止(因为凭证必须存储在内存中的程序,在实际使用当中),但有一对夫妇的技术来减轻它:

  • 最小化的时间敏感数据被存储在存储器中的量
  • 一旦覆盖内存,不再需要数据
  • 裂伤内存中的数据,不断地移动它,并通过隐藏的措施等安全

Python的特别

第一种技术是很容易实现,有可能通过一个密钥环 (希望内核空间存储)

第二个是无法实现在无需编写C模块中,在我所知的(但我喜欢在这里是错误证明,或让现有的模块列表)

第三个是棘手。

特别是,蟒蛇是有非常强大的内省和反思能力的一种语言,就很难阻止任何人可在翻译过程中执行Python代码访问凭据。

似乎有一个共识, 有没有办法执行私有属性 ,并且试图在它充其量激怒谁在使用你的代码的其他程序员 。

问题

考虑到所有这些考虑,一个人如何安全地使用python存储认证证书? 什么是最好的做法? 能否讲讲语“一切都是公开”的理念办呢? 我知道, “我们都同意的成年人在这里” ,但我们应该被迫与攻击者分享我们的密码,并使用另一种语言之间进行选择?

Answer 1:

有两个非常不同的原因,你可以存储认证证书:

  1. 为了验证您的用户:例如,你只允许到服务的用户访问的用户验证到您的程序后,
  2. 为了验证与其他程序或服务的程序 :例如,用户启动程序,然后访问用户的电子邮件在使用IMAP互联网。

在第一种情况下,你永远不应该存储密码(或密码的加密版本)。 相反,你应该有一个高品质的盐散列密码,并确保您使用的哈希算法是计算成本(以防止字典攻击),例如PBKDF2或bcrypt。 见盐渍中的密码哈希-这样做是正确欲知更多详情。 如果按照这个方法,即使黑客获取腌制,缓慢散列令牌,他们不能这样做非常符合它。

在第二种情况下,有许多事情做是为了秘密发现更难(因为你在你的问题概括),如:

  • 保持,直到需要加密的秘密,解密需求,然后立即之后重新加密
  • 使用寻址空间随机所以每次应用程序运行时,密钥被存储在不同的地址
  • 使用OS密钥库
  • 使用“硬”的语言,如C / C ++,而不是基于VM-,自省的语言如Java或Python

这种方法肯定比没有好,但一个熟练的黑客迟早会打破它。

令牌

从理论的角度来看,认证是证明质疑者是谁,他们说他们的行为。 传统上,这与共享的秘密(密码)实现的,但也有其他的方式来证明自己,其中包括:

  • 出带外验证。 例如,我住的地方,当我尝试登录到我的网上银行,我收到一个一次性密码 (OTP)作为我的手机短信。 在这种方法中,我证明我是凭借拥有一个特定电话号码
  • 安全令牌 :要登录到服务,我必须按我的令牌按钮获得OTP然后我为我的密码使用。
  • 其他设备:

    • 智能卡 ,特别是采用美国国防部在那里它被称为CAC 。 Python有一个模块调用pyscard接口到这个
    • NFC设备

而一个更完整的列表在这里

所有这些方法之间的共同点是最终用户控制这些设备和秘密实际上从未离开令牌/卡/手机,当然绝不会存储在你的程序。 这使他们更安全。

会话盗用

但是(总有一个但是):

让我们假设你管理,以确保登录,这样黑客无法访问安全令牌。 现在,您的应用程序与愉快的安全服务交互。 不幸的是,如果黑客可以在您的计算机上运行任意可执行文件,黑客就可以通过注入额外的命令到您的有效使用该服务的劫持例如会话。 换句话说,当你保护了密码,这是完全不相关的,因为黑客仍然能够访问到“安全”的资源。

这是一个非常现实的威胁,作为多跨站点脚本攻击有节目(一个例子是美国银行和美国银行网站弱势 ,但也有无数的更多)。

安全代理

如上所述,有在保持对第三方服务或系统,以便应用程序可以登录到它,尤其是如果仅记录上的做法是用户名和密码的帐户的凭据的一个根本问题。

一种方法通过委托通信的服务,安全代理部分缓解这一点,并开发应用程序和代理之间的安全登录方式。 在这种方法

  • 该应用程序使用PKI方案或双因素身份验证登录到安全代理
  • 该用户增加了安全证书的第三方系统的安全代理。 凭据不会存储在应用程序
  • 后来,当应用程序需要访问第三方系统,它发送到代理的请求。 代理登录使用的安全证书和提出请求,返回结果给应用程序。

这种方法的缺点是:

  • 用户可能不希望与该凭证的存储信任的安全代理
  • 用户可能不流动的数据通过它向第三方应用程序信任安全代理
  • 应用程序所有者拥有额外的基础设施和运行代理托管费用

一些答案

因此,在具体的答案:

怎样才能安全地使用python存储认证证书?

  • 如果该应用程序存储密码对用户进行认证,使用PBKDF2算法,如https://www.dlitz.net/software/python-pbkdf2/
  • 如果存储的口令/安全令牌访问其他服务,那么就没有绝对安全的方式。
  • 然而,考虑改用验证策略,例如智能卡,使用,例如, pyscard 。 您可以使用智能卡到两个用户进行身份验证的应用程序,并且还安全的身份验证与X.509证书的应用程序到另一个服务。

能否讲讲语“一切都是公开”的理念办呢? 我知道,“我们都同意的成年人在这里”,但我们应该被迫与攻击者分享我们的密码,并使用另一种语言之间进行选择?

恕我直言,没有什么错用Python写,做它的damnedest隐藏秘密信息的特定模块,使其成为一个正确开溜为他人重用(恼人的其他程序员为它的目的 )。 你甚至可以用C编写大的部分,并链接到它。 但是,不要对其他模块的原因是显而易见的做到这一点。

不过说到底,如果黑客对计算机的控制,有计算机上没有隐私可言。 理论上最坏的情况是,你的程序在虚拟机上运行,而黑客的所有内存的完全访问权限的计算机上,包括BIOS和显卡,并且可以踩你的应用程序,虽然身份验证,发现它的秘密。

由于没有绝对的隐私,剩下的只是迷惑,和保护的水平简直是多么不容易混淆与一个熟练的黑客多少希望的信息。 我们都知道如何在结束 ,即使是定制的硬件和数十亿美元的产品 。

使用Python钥匙圈

虽然这会很安全相对于其他应用程序管理键,令牌的所有Python应用程序共享访问。 这不是一点半点的安全,以你担心攻击类型。



Answer 2:

我在这个领域没有专家,我真的只是希望解决你是同样的问题,但看起来像Hashicorp跳马也许能帮忙相当不错。

特别WRT存储用于第三部分服务证书的问题。 例如:

在API驱动一切的现代世界中,许多系统还支持编程方式创建访问凭据。 库利用这种支持通过一个称为动态秘密特征:被点播生成的秘密,并且还支持自动撤销。

针对Vault 0.1,Vault支持动态生成AWS,SQL和领事凭证。

更多链接:

  • Github上
  • 库网站
  • 用例


文章来源: Secure credential storage in python