【问题标题】:Safe to hide a private RSA key behind #if debug?安全地在#if 调试后面隐藏私有 RSA 密钥?
【发布时间】:2017-01-15 14:10:53
【问题描述】:

已经找到这么多答案后的第一个问题......

我创建了一个使用 RSA 签名的许可证类。使用公钥检查签名,使用私钥创建签名。由于我只自己创建许可证,因此签名/创建代码不需要在许可证类本身(已发布代码)中。但另一方面,我希望将所有类代码放在一起,而不是在甚至是另一个项目(本地许可证管理器应用程序)的一部分的部分类中编写许可证签名/创建代码。执行以下操作是否安全:

public class License {
    private const string publicRSA = "whatever";

    #if DEBUG

    public void CreateLicense()
    {
        string privateRSA = "whatever again";

        // Do license creation stuff below...

    }

    #endif

    // Other license code follows below....

}

线索是在发布版本中,私钥不应该是可见的,也不是创建许可证的代码,但对我来说,在本地运行在调试模式下使用此类的许可证管理器应用程序没有问题当我需要不时生成许可证时...

我在这里遗漏了什么(关于 C# 中的预编译器行为...)?除了意外发布调试版本之外,我可以这样做吗?有更好的选择吗?

【问题讨论】:

  • 编译后的发行版不会包含#if DEBUG指令中的代码,所以我认为它应该对开发是安全的。但是,一旦您开始发布该软件,我会将其全部删除,以免您不小心将调试版本发送给客户端。
  • @Zohar。应用程序发布后,我仍然使用本地许可证管理器中的相同类为使用已发布代码的人生成许可证。所以我不能删除它。

标签: c# cryptography


【解决方案1】:

如果条件不满足,if 指令不会编译其中的代码,这意味着无法反汇编已发布的代码以获得私有 RSA 密钥。

当 C# 编译器遇到 #if 指令,最后是 #endif 指令时,只有定义了指定的符号,它才会编译指令之间的代码。

https://msdn.microsoft.com/en-us/library/4y6tbswk.aspx

但是,我们不知道编译器或 Visual Studio 在构建时可能会使用哪种优化,因此它可能会在其他一些临时文件中编译 RSA 代码以进行缓存或其他任何内容,即使发布的代码不包含指定的代码。

另外,建议将此类关键信息存储在另一个文件夹中的另一个文件中,在源代码管理之外,这样就不会被错误提交,并且有一个配置密钥来存储文件的路径,因此可以访问按运行时。您可以在此页面中找到更多信息:

https://www.asp.net/identity/overview/features-api/best-practices-for-deploying-passwords-and-other-sensitive-data-to-aspnet-and-azure

【讨论】:

  • 很好的信息,谢谢。我更改了我的设置,使得 CreateLicense() 仍然在#if DEBUG / #endif 之间,但是从一个不在将要发布的项目树中的文件中读取私有 RSA 密钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 2018-11-11
相关资源
最近更新 更多