python中的安全凭证存储 袭击

python中的安全凭证存储 袭击,python,security,reflection,storage,credentials,Python,Security,Reflection,Storage,Credentials,在凭证存储环境中,一种可能的威胁模型是攻击者,该攻击者能够: 检查任何(用户)进程内存 读取本地(用户)文件 顺便说一句,关于这种类型的攻击的共识是不可能预防(因为凭证必须存储在内存中,程序才能实际使用它们),但有几种技术可以缓解这种攻击: 尽可能缩短敏感数据存储在内存中的时间 一旦不再需要数据,立即覆盖内存 损坏内存中的数据,不断移动数据,并通过隐藏措施确保其他安全性 尤其是Python 第一种技术很容易实现,可能(希望是内核空间存储) 就我所知,如果不写一个C模块,第二个是不可能实现

在凭证存储环境中,一种可能的威胁模型是攻击者,该攻击者能够:

  • 检查任何(用户)进程内存
  • 读取本地(用户)文件
顺便说一句,关于这种类型的攻击的共识是不可能预防(因为凭证必须存储在内存中,程序才能实际使用它们),但有几种技术可以缓解这种攻击:

  • 尽可能缩短敏感数据存储在内存中的时间
  • 一旦不再需要数据,立即覆盖内存
  • 损坏内存中的数据,不断移动数据,并通过隐藏措施确保其他安全性
尤其是Python 第一种技术很容易实现,可能(希望是内核空间存储)

就我所知,如果不写一个C模块,第二个是不可能实现的(但我希望在这里被证明是错误的,或者有一个现有模块的列表)

第三个问题很棘手

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

似乎有一种共识

问题
考虑到所有这些,如何使用python安全地存储身份验证凭据?最佳实践是什么?对于“一切都是公共的”这一语言哲学,我们能做些什么吗?我知道,但我们应该被迫在与攻击者共享密码和使用其他语言之间做出选择吗?

存储身份验证凭据的原因有两个截然不同的原因:

  • 对用户进行身份验证:例如,只有在用户对您的程序进行身份验证后,您才允许用户访问服务
  • 使用其他程序或服务验证程序:例如,用户启动您的程序,然后使用IMAP通过Internet访问用户的电子邮件
  • 在第一种情况下,您不应存储密码(或密码的加密版本)。相反,您应该使用高质量的salt对密码进行散列,并确保使用的散列算法在计算上是昂贵的(以防止字典攻击),例如PBKDF2或bcrypt。有关更多详细信息,请参阅。如果您采用这种方法,即使黑客检索到盐渍的、缓慢散列的令牌,他们也无法对其进行太多处理

    在第二种情况下,为了使秘密发现更加困难(如您在问题中所概述的),我们做了很多事情,例如:

    • 在需要之前对机密进行加密,按需解密,然后在需要后立即重新加密
    • 使用地址空间随机化,因此每次应用程序运行时,密钥都存储在不同的地址
    • 使用操作系统密钥库
    • 使用C/C++等“硬”语言,而不是Java或Python等基于VM的内省语言
    这样的方法当然比什么都没有好,但一个熟练的黑客迟早会打破它

    代币 从理论角度来看,认证是证明被质疑者是他们所说的人的行为。传统上,这是通过共享秘密(密码)实现的,但也有其他方法来证明自己,包括:

    • 认证。例如,在我居住的地方,当我尝试登录我的网上银行时,我会在手机上收到一条短信(OTP)。在这个方法中,我通过拥有一个特定的电话号码来证明我是正确的
    • :要登录到服务,我必须按下令牌上的按钮以获取OTP,然后将其用作密码
    • 其他设备:

      • ,特别是美国国防部使用的,称为。Python有一个被调用的模块来与此接口
      • 装置
    还有一份更完整的清单

    所有这些方法的共同点是,最终用户控制这些设备,秘密实际上从未离开令牌/卡/电话,当然也从未存储在您的程序中。这使他们更加安全

    会话窃取 然而(总是有一个例外):

    假设您设法保护登录,使黑客无法访问安全令牌。现在,您的应用程序正愉快地与安全服务交互。不幸的是,如果黑客可以在您的计算机上运行任意可执行文件,那么黑客可以劫持您的会话,例如通过向您的服务有效使用中注入额外命令。换句话说,虽然你已经保护了密码,但这完全无关,因为黑客仍然可以访问“安全”资源

    这是一个非常现实的威胁,正如多个跨站点脚本攻击所显示的那样(一个例子是,但还有无数个)

    安全代理 如上所述,在第三方服务或系统上保留帐户的凭据,以便应用程序可以登录,这是一个基本问题,特别是当唯一的登录方法是用户名和密码时

    一种部分缓解这种情况的方法是将服务的通信委托给安全代理,并在应用程序和代理之间开发一种安全的登录方法。在这种方法中

    • 应用程序使用PKI方案或双因素身份验证登录到安全代理上
    • 用户将第三方系统的安全凭据添加到安全代理。凭据从不存储在应用程序中
    • 稍后,当应用程序需要访问第三方系统时,它会向代理发送请求。代理使用安全凭据登录并发出请求,并将结果返回给应用程序
    这种方法的缺点是:

    • 用户可能不希望将安全代理信任给st