当前位置: 首页 > 面试题库 >

python中的安全凭证存储

苏野
2023-03-14
问题内容

攻击

在凭证存储的情况下,一种可能的威胁模型是攻击者,它具有以下能力:

  • 检查任何(用户)进程内存
  • 读取本地(用户)文件

AFAIK,这种攻击的共识是无法阻止(因为必须将凭据存储在内存中,程序才能实际使用它们),但是有两种技术可以缓解这种攻击:

  • 最小化敏感数据在内存中的存储时间
  • 一旦不再需要数据,将覆盖内存
  • 通过模糊措施来处理内存中的数据,继续移动数据以及其他安全性

特别是Python

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

据我所知,不编写C模块根本无法实现第二个(但是我很乐意在这里被证明是错误的,或者希望有一个现有模块的列表)

第三个是棘手的。

特别是,由于python是具有非常强大的自省和反射功能的语言,因此很难阻止能够在解释器过程中执行python代码的任何人访问凭据。

似乎已经达成共识,那就是无法强制执行私有属性,而尝试进行私有属性](http://codingdict.com/questions/160025)充其量只会使其他正在使用您的代码的程序员烦恼。

问题

考虑到所有这些,如何使用python安全地存储身份验证凭据?最佳做法是什么?关于“一切都是公共的”哲学这个语言,可以做些什么吗?我知道“我们所有人都同意这里的成年人”,但是我们是否应该被迫在与攻击者共享密码和使用另一种语言之间进行选择?


问题答案:

为什么要存储身份验证凭据,有两个非常不同的原因:

  1. 为了验证 您的 用户:例如,只允许用户验证到您的程序后,用户对服务的访问
  2. 要使用另一个程序或服务 对程序 进行身份验证:例如,用户启动您的程序,然后使用IMAP通过Internet访问用户的电子邮件。

在第一种情况下,永远不要存储密码(或密码的加密版本)。相反,您应该使用高质量的盐对密码进行 哈希处理
,并确保您使用的哈希算法在计算上昂贵(以防止字典攻击),例如PBKDF2或bcrypt。有关更多详细信息,请参见咸密码哈希-
正确
执行。如果您采用这种方法,即使黑客检索到盐渍,哈希值低的令牌,他们也不会做太多事情。

在第二种情况下,有许多事情使秘密发现变得更加困难(正如您在问题中所概述的),例如:

  • 保持机密直到需要时才加密,按需解密,然后在之后立即重新加密
  • 使用地址空间随机化,因此每次应用程序运行时,密钥都存储在不同的地址
  • 使用操作系统密钥库
  • 使用“硬”语言(例如C / C ++)而不是基于VM的自省语言(例如Java或Python)

这样的方法肯定总比没有好,但是熟练的黑客迟早会破解它。

代币

从理论上讲,认证是证明被挑战者就是他们所说的人的行为。传统上,这是通过共享机密(密码)实现的,但是还有其他方式可以证明自己,包括:

  • 带外认证。例如,在我居住的地方,当我尝试登录网上银行时,我在手机上收到了一次性密码(OTP)作为SMS。通过这种方法,我证明自己拥有一个特定的电话号码
  • 安全令牌:要登录服务,我必须按令牌上的按钮以获取OTP,然后将其用作密码。
  • 其他设备:

    • SmartCard,特别是美国国防部使用的智能卡,称为CAC。Python有一个名为pyscard的模块可以与此接口
    • NFC设备

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

所有这些方法之间的共同点是,最终用户可以控制这些设备,并且机密实际上不会离开令牌/卡/电话,并且绝对不会存储在您的程序中。这使它们更加安全。

会话窃取

但是(总是有一个):

让我们假设您设法保护登录名安全,以便黑客无法访问安全令牌。现在,您的应用程序很高兴与安全服务进行交互。不幸的是,如果黑客可以在您的计算机上运行任意可执行文件,则黑客可以例如通过向服务的有效使用中注入其他命令来劫持您的会话。换句话说,虽然您已经保​​护了密码,但是这完全无关紧要,因为黑客仍然可以访问“安全”资源。

正如多种跨站点脚本攻击所显示的那样,这是一个非常现实的威胁(一个例子是“美国银行”和“美国银行网站易受攻击”,但还有更多的威胁)。

安全代理

如上所述,存在一个基本问题,即在第三方服务或系统上保留帐户的凭据,以便应用程序可以登录到它,尤其是在唯一的登录方法是用户名和密码的情况下。

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

  • 该应用程序使用PKI方案或两因素身份验证来登录安全代理
  • 用户将安全凭证添加到第三方系统的安全代理中。凭据永远不会存储在应用程序中
  • 稍后,当应用程序需要访问第三方系统时,它将请求发送给代理。代理使用安全凭证登录并发出请求,并将结果返回给应用程序。

这种方法的缺点是:

  • 用户可能不希望信任凭据存储与安全代理
  • 用户可能不信任通过它流到第三方应用程序的数据的安全代理
  • 应用程序所有者具有用于运行代理的其他基础结构和托管成本

一些答案

因此,针对特定答案:

如何使用python安全地存储身份验证凭据?

  • 如果存储应用程序的密码以验证用户身份,请使用PBKDF2算法,例如https://www.dlitz.net/software/python-pbkdf2/
  • 如果存储密码/安全令牌以访问其他服务,则没有绝对安全的方法。
  • 但是,请考虑使用pyscard将身份验证策略切换到例如智能卡。您可以使用智能卡对用户进行身份验证,也可以使用X.509证书对应用程序进行安全身份验证。

关于“一切都是公共的”哲学这个语言,可以做些什么吗?我知道“我们所有人都同意这里的成年人”,但是我们是否应该被迫在与攻击者共享密码和使用另一种语言之间进行选择?

恕我直言,用Python编写一个 特定的 模块并没有什么错,因为它确实可以隐瞒秘密信息,这使其成为其他人重用的正确工具(讨厌其他程序员 是其目的
)。您甚至可以用C编写大部分代码并链接到它。但是,出于明显的原因,请勿对其他模块执行此操作。

但是,最终,如果黑客控制了计算机,则计算机上根本没有隐私。从理论上讲,最坏的情况是您的程序正在VM中运行,黑客可以完全访问计算机上的 所有
内存,包括BIOS和图形卡,并且可以通过身份验证来逐步执行您的应用程序以发现其秘密。

在没有绝对隐私的情况下,剩下的仅仅是混淆,而保护的级别就是混淆的难易程度与熟练的黑客想要多少信息。而且我们都知道结局如何,即使是定制硬件和价值十亿美元的产品也是如此。

使用Python密钥环

尽管这将相当安全地管理其他应用程序的密钥,但 所有Python应用程序都 共享对令牌的访问。对于您担心的攻击类型,这一点也不安全。



 类似资料:
  • 问题内容: 运行WebSphere MQ Server v7.1的Linux Server Box: 我在Linux中创建了一个属于’mq-users’组的用户’mq- user’。然后,我创建了队列管理器,并使用MQSC发出以下命令来创建队列并设置安全性: 运行WebSphere MQ Client v7.1和WebSphere MQ Explorer的Linux Client Box: 我以我

  • 如果你使用的是 SSH 方式连接远端,并且设置了一个没有口令的密钥,这样就可以在不输入用户名和密码的情况下安全地传输数据。 然而,这对 HTTP 协议来说是不可能的 —— 每一个连接都是需要用户名和密码的。 这在使用双重认证的情况下会更麻烦,因为你需要输入一个随机生成并且毫无规律的 token 作为密码。 幸运的是,Git 拥有一个凭证系统来处理这个事情。 下面有一些 Git 的选项: 默认所有都

  • 在带有npm 7.12.0版的Ubuntu上安装最新的web3 1.3.5版失败,出现了几个严重错误。修复的典型时间范围是什么? 下划线1.3.2-1.12.0 严重性:高 任意代码执行-https://npmjs.com/advisories/1674\没有可用的修复程序 节点\模块/下划线 。web3 bzz

  • 我最近一直在寻找一个如何在CentOS 7中安全保存git凭证的解决方案。 我想保存多个git存储库的凭据。 我想出的解决方案是将侏儒密钥环与任何版本的git一起使用。但我遇到了一些问题。我发现很多帖子说这在Redhat 7或Centos 7中不是一个好的解决方案。,它将被弃用。 但这对我不起作用,使用git时出错: 与gnome-keyring-daemon通信时出错 然后我把git升级到最后一

  • 问题内容: 如何将用户输入的密码存储在内存中,并在不再需要时安全地擦除它? 为了详细说明,目前我们有以下代码: 调用该方法后,我们该怎么办才能用乱码填充包含密码的内存区域,以使某人无法通过执行核心转储来恢复密码? 可以用Python完成吗? 问题答案: Python对内存的控制没有那么低。接受它,继续前进。在 最好的 ,你可以做的是调用后,这样的口令字符串对象的引用依然存在。任何声称能够做得更多的

  • 如果你使用的是 SSH 方式连接远端,并且设置了一个没有口令的密钥,这样就可以在不输入用户名和密码的情况下安全地传输数据。 然而,这对 HTTP 协议来说是不可能的 —— 每一个连接都是需要用户名和密码的。 这在使用双重认证的情况下会更麻烦,因为你需要输入一个随机生成并且毫无规律的 token 作为密码。 幸运的是,Git 拥有一个凭证系统来处理这个事情。 下面有一些 Git 的选项: 默认所有都