6

我的问题与这个问题基本相同,但针对的是 Windows Store App、c# 和 Visual Studio。我想有一种简单的方法将项目中的秘密值保存在一个可以在源代码控制中忽略(未签入)的文件中。我应该如何构建我的项目以以一种易于构建/源代码控制的方式存储应用程序机密?

我的第一个想法是将它存储在一个 XML 文件中(未签入),并在运行时加载它,但这使它对安装它的用户可用,因此应该在构建时完成。构建项目时,如何存储几个秘密值并让 Visual Studio 在我的代码中替换它们?

4

4 回答 4

0

在您的项目中创建一个新的类文件,其中包含所有秘密值的插槽,并为所有这些值保存虚拟/测试值。将其与项目的其余部分一起检查到源代码控制中,以便任何构建它而不访问机密的人都将获得某种测试版本。

然后,使用真正的秘密值创建该类文件的副本,并将其放在源代码控制之外的某个位置。在预构建事件中编写一个批处理脚本来查找此类文件,如果找到,则用它替换项目中包含的虚拟文件。

这样,您的项目仍然可以在源代码控制中,任何人都可以检查、构建并在测试模式下运行它。您的秘密文件/值仅存储在您的构建服务器上,因此只有当您构建项目时,它才会具有真正的值。

请记住在某处备份您的秘密文件。还要记住 .NET 代码可以很容易地反编译,因此您的秘密可能不像您希望的那样秘密 - 任何具有 .NET 反射器的用户都可以看到您的发布程序集中的所有代码,包括您的秘密类。

于 2013-04-18T18:44:40.550 回答
0

更新
如果您将秘密放在不受信任的区域(例如公共源代码控制),则它很容易受到攻击。即使它是加密的,只要有足够的努力,它也可以被检索到。

真正让它遥不可及的唯一方法是拥有一个与 3rd 方 API 交互的外部服务。这有其自身的权衡(例如,您在评论中提到的用户身份验证)。特别是如果您的开发人员在测试时需要使用 3rd 方 API,我认为没有其他替代方案可以限制秘密的曝光。

于 2013-04-16T21:51:30.150 回答
0

一种选择是将机密存储在源代码管理中,但以加密形式存储它们。在您的开发或构建环境中,使用环境变量来存储密钥并即时解密。这样您就可以获得源代码控制的好处,同时保证您的信息安全。

即使您使用的是 app.config 或 web.config,也可以这样做,您只需要在启动时从代码中修改配置。

埃里克

于 2013-04-16T19:38:16.507 回答
0

在我公司,我们决定为您提供以下解决方案。在配置文件中,我们将部分与外部配置中的“秘密”值链接起来。外部配置在源代码控制上。首先不是,但是在我们的构建服务器丢失磁盘时出现问题后,我们决定将其存储在有备份的地方更安全。源代码管理中的文件夹(也可以在文件服务器上)实际上仅限于对需要此文件的人进行读写。构建过程结帐“项目”文件夹加上“配置”文件夹并进行构建。构建“配置”文件夹后删除。对构建服务器的访问也受到限制。

于 2013-04-16T19:25:38.373 回答