C#:创建从加密文件读取的SecureString

C#:创建从加密文件读取的SecureString,c#,encryption,securestring,C#,Encryption,Securestring,我是一名QA自动化分析师,在我的一次测试中,我需要验证是否已将触发的电子邮件发送到客户的电子邮件。使用exchange服务,我可以连接到为测试而创建的邮箱,验证那里是否有未读的电子邮件,并根据需要处理这些信息 出现此问题的原因是,由于我需要登录Exchange Server,因此需要服务帐户凭据,并且我不想公开密码。我试图想出的解决方案是用密码加密文件,让我的代码解密文件,并用它创建一个SecureString,然后再次加密。。。问题是,在调试代码时,密码仍然会暴露 代码模板下方:: priva

我是一名QA自动化分析师,在我的一次测试中,我需要验证是否已将触发的电子邮件发送到客户的电子邮件。使用exchange服务,我可以连接到为测试而创建的邮箱,验证那里是否有未读的电子邮件,并根据需要处理这些信息

出现此问题的原因是,由于我需要登录Exchange Server,因此需要服务帐户凭据,并且我不想公开密码。我试图想出的解决方案是用密码加密文件,让我的代码解密文件,并用它创建一个
SecureString
,然后再次加密。。。问题是,在调试代码时,密码仍然会暴露

代码模板下方::

private static SecureString getServiceAccountPassword()
{
        string folderPath = DataEnum.SA_PASSWORD_FILE;
        Encryption.Decrypt(folderPath);
        SecureString pasw = new SecureString();

        foreach (char c in File.OpenText(folderPath).ReadToEnd().ToCharArray())
        {
            pasw.AppendChar(c);
        }

        Encryption.Encrypt(folderPath);
        return pasw;
}
所以我的问题是:有没有一种方法可以创建一个不同的
SecureString
,而不公开密码?还是我使用了错误的方法?任何输入都会有帮助

致以最良好的祝愿。

这是我的清单:

  • 不要使用加密文件。如果必须使用加密文件,请使用Windows数据保护API对其进行加密
  • 使用组托管服务帐户和Win32 API调用GetServiceAccountPassword
    • 这是我的清单:

      • 不要使用加密文件。如果必须使用加密文件,请使用Windows数据保护API对其进行加密
      • 使用组托管服务帐户和Win32 API调用GetServiceAccountPassword

      我很想从那些更了解情况的人那里看到答案,但我只是想了解一下我的知识。我认为SecureStrings的目的是在内存中对数据进行加密,因此,如果某些人在密码位于内存中时对相关系统进行内存转储,他们将无法获取密码。我认为安全字符串也不能满足您的要求。IMO需要在调试器中加密密码吗?如果它的帐户非常敏感,则不应在测试中使用它,您应该设置一个单独的测试帐户。这个想法是在使用具有交互式登录的服务帐户时声明责任,只有一个人应该知道密码。但我们仍然需要一个帐户登录到exchange server并验证该电子邮件。我曾考虑使用员工自己的密码(执行测试的密码),但我们的目标是安排所有测试在VM上执行,在这种情况下,我们不能使用一名员工的凭据。是的,也许你是对的,最好的方法是分离责任,创建一个共享用户,而不使用交互式登录,只用于检查邮箱……我的想法是,如果我想查看密码,我是另一个测试人员,例如,我可以创建一个新的测试,对密码文件进行解密,并将其保存为新文件,或者将密码提取为普通字符串。如果你打算这样公开密码,请确保它是一个没有访问权限的帐户的密码。如果这不可能,那么对我来说,这意味着你需要重新设计测试。由于我认为您总是容易将密码暴露给您不想公开的人,从而忽略了上面提到的所有有效点—您也错误地使用了SecureString(虽然您不应该在这里使用它,但仍然应该使用它),因为
      File.OpenText(folderPath).ReadToEnd()
      使用您的密码创建常规的
      字符串
      ,SecureString的全部目的就是为了避免这种情况。我很好奇,想从一些更了解情况的人那里了解到这个问题的答案,但我只是想补充一下我的知识。我认为SecureStrings的目的是在内存中对数据进行加密,因此,如果某些人在密码位于内存中时对相关系统进行内存转储,他们将无法获取密码。我认为安全字符串也不能满足您的要求。IMO需要在调试器中加密密码吗?如果它的帐户非常敏感,则不应在测试中使用它,您应该设置一个单独的测试帐户。这个想法是在使用具有交互式登录的服务帐户时声明责任,只有一个人应该知道密码。但我们仍然需要一个帐户登录到exchange server并验证该电子邮件。我曾考虑使用员工自己的密码(执行测试的密码),但我们的目标是安排所有测试在VM上执行,在这种情况下,我们不能使用一名员工的凭据。是的,也许你是对的,最好的方法是分离责任,创建一个共享用户,而不使用交互式登录,只用于检查邮箱……我的想法是,如果我想查看密码,我是另一个测试人员,例如,我可以创建一个新的测试,对密码文件进行解密,并将其保存为新文件,或者将密码提取为普通字符串。如果你打算这样公开密码,请确保它是一个没有访问权限的帐户的密码。如果这不可能,那么对我来说,这意味着你需要重新设计测试。由于我认为您总是容易将密码暴露给您不想公开的人,从而忽略了上面提到的所有有效点—您也错误地使用了SecureString(虽然您不应该在这里使用它,但仍然应该使用它),因为
      File.OpenText(folderPath).ReadToEnd()
      使用您的密码创建常规的
      字符串
      ,SecureString的全部目的就是避免这种情况。