安全隐藏#if debug后面的私有RSA密钥?

时间:2017-01-15 14:10:54

标签: c# cryptography

在找到这么多答案后,第一个问题就在这里......

我制作了一个使用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#中的预编译器行为......)?除了意外发布调试版本之外,我可以通过这样做拍摄自己吗?有更好的选择吗?

1 个答案:

答案 0 :(得分:0)

如果条件不满足,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