【问题标题】:How to encrypt and decrypt passwords for selenium testing?如何加密和解密硒测试的密码?
【发布时间】:2015-08-13 01:24:20
【问题描述】:

上下文是使用 selenium 测试 Web 应用程序,同时使用我们为此目的创建的许多虚拟用户帐户。因此测试过程需要访问我们的站点并使用虚拟用户的 id 和密码登录。

这些帐户都不是关键帐户,它们被标记为测试帐户,因此不会造成任何损害。不过,在使用之前加密密码并解密它们可能是个好主意。

如果重要的话,我们的测试应用程序是用 Python、Django 编写的,并使用 PostgreSQL 作为数据库。它在一个小型 Linode 实例上运行。

这样的最佳实践是什么?

编辑 1

我的另一个想法是将凭据存储在第二台机器上并通过 API 访问它们,同时只允许从已知服务器的非公共 IP 进行访问。换句话说,在 Linode 获取两个实例并在数据中心内创建私有机器对机器连接。

在这种情况下,如果某人能够对 API 代码进行去混淆处理,则访问第一台机器将允许他们潜在地向第二台机器发出请求。如果有人真的想要数据,他们当然可以得到。

我们可以添加两因素身份验证作为门控测试的一种方式。换句话说,即使您有我们未加密的 test_users 表,您也无法对它们执行任何操作,因为 2FA 机制仅针对这些用户。

由于这仅用于测试目的,我开始认为最好的解决方案很可能是仅在运行测试时使用有效密码填充test_users 表。当我们想要运行测试套件时,我们可以将数据安全地保存在其他地方,并拥有一个将数据上传到测试服务器的脚本。有权访问此表的人无法使用它,因为所有密码都将无效。事实上,我们或许可以利用这一事实来检测此类违规行为。

我只是讨厌存储未加密密码的想法,即使它是为了测试用户而不能真正对实际应用造成任何损害(他们的交易是虚拟的)。

编辑 2

对此的改进是继续加密数据并将其保存在测试服务器中。但是,每次运行测试时,系统都会与我们联系以获取加密密钥。而且,也许,在测试运行之后,数据会用新密钥重新加密。有点令人费解,但它允许在测试服务器上加密密码(甚至是用户 ID,只是为了让它更难)。最重要的密钥不会靠近服务器,每次使用后它都会自毁。

【问题讨论】:

    标签: python django postgresql selenium


    【解决方案1】:

    在这种情况下,一般做的是将密码通过cryptographic hash function,并存储散列密码。

    要验证登录,请对提供的密码进行哈希处理,并将计算得到的哈希值与存储的版本进行比较。

    这背后的想法是不可能逆转一个好的加密哈希函数。因此,攻击者是否可以读取散列密码并不重要。

    Python3 中的示例:

    In [1]: import hashlib
    
    In [2]: hashlib.sha256('This is a test'.encode('utf8')).hexdigest()
    Out[2]: 'c7be1ed902fb8dd4d48997c6452f5d7e509fbcdbe2808b16bcf4edce4c07d14e'
    
    In [3]: hashlib.sha256('This is a tist'.encode('utf8')).hexdigest()
    Out[3]: 'f80b4162fc28f1f67d1a566da60c6c5c165838a209e89f590986333d62162cba'
    
    In [4]: hashlib.sha256('This is a tst.'.encode('utf8')).hexdigest()
    Out[4]: '1133d07c24ef5f46196ff70026b68c4fa703d25a9f12405ff5384044db4e2adf'
    

    (对于 Python2,只需省略 encode。)

    如您所见,即使是一个字母的更改也会导致哈希值发生很大的变化。

    【讨论】:

    • 这里的目的不是散列密码然后只是比较散列。我需要实际使用纯文本密码来使用 selenium 进行自动负载测试。在这种情况下,我们的测试工具将检索用户 ID 和密码,并使用我们的一个测试用户使用它们登录我们的网站。我只是在探索加密密码的想法,而不是将它们作为纯文本存储在数据库中。我知道这个练习可能是徒劳的,但我至少要考虑一下。有人建议将密钥或密码短语作为环境变量存储在操作系统中。
    • 散列适用于大多数用途,但不幸的是,对于 selenium 测试,必须在密码字段中输入真实密码
    • @martin's 在假设攻击者可以访问存储密码的机器的假设下,您只能减慢攻击者的速度。
    • @RolandSmith,看我的编辑。你说的对。不确定这个问题是否有真正的解决方案。
    • @martin's 我不会太担心测试密码。如果攻击者可以访问数据库,那么您的安全性已经被破坏了。
    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    相关资源
    最近更新 更多