【问题标题】:C# Most secure way to load a password into Process method with a serviceC# 使用服务将密码加载到 Process 方法中的最安全方法
【发布时间】:2017-03-16 21:02:40
【问题描述】:

我有一个 C# 服务需要以另一个用户身份运行一个进程(交互模式)。该用户是管理员级别的用户,我知道我不应该将密码作为字符串存储在代码中。

我可以使用一些帮助来为我指明正确的方向,因为我所做的所有研究似乎都指向了很多似乎都不适合我想做的方法。

我是否需要将散列密码存储在配置文件中?我可以在代码中存储一个散列密码,然后有人将它传递给一个安全的字符串吗?我觉得有点迷茫,可以使用一些指导。

【问题讨论】:

  • 将 PW 保存为 SecureString 应该没有问题 - 但您应该直接将 PW 的原始形式解析为 SecureString 而不是将其保存为普通字符串 - 即使在您的代码作为全局变量。不过,解析为 SecureString 应该不难。
  • 问题是我没有插入 PW。我需要服务按计划为我执行此操作。

标签: c# service password-storage


【解决方案1】:

如果我正确理解了这个问题,您需要明文密码,这样您就可以以另一个用户身份启动外部进程。这将排除密码哈希,因为您需要明文密码。

1) 您可以做的最安全的事情可能是在服务启动时询问密码。只要服务启动,服务就可以将密码保存在内存中。

  • 这样您就不必将密码存储在硬盘上。
  • 缺点当然是服务启动时必须输入密码。

2) 如果您需要保留密码,没有绝对安全的方法,但 Windows 提供了一个 API 来解决这个问题,即数据保护 API (DPAPI)。它解决了一个问题,即如果不将密钥存储在某处,就无法加密密码(这引发了将密钥存储在哪里的问题......)。

using System.Security.Cryptography;

byte[] passwordBytes = Encoding.UTF8.GetBytes(plaintextPassword);
byte[] encryptedPassword = ProtectedData.Protect(passwordBytes, optionalEntropy, DataProtectionScope.LocalMachine);

使用此代码,Windows 将使用运行计算机的信息对密码进行加密。只有在这台计算机上运行的进程才能解密密码。

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2017-08-23
    相关资源
    最近更新 更多