在每个C#应用程序中都可以找到哪些信息作为加密的唯一salt?

在每个C#应用程序中都可以找到哪些信息作为加密的唯一salt?,c#,dpapi,C#,Dpapi,在每个C#应用程序中都可以找到哪些信息可以用作加密的唯一salt,包括web应用程序、windows服务和wcf层 我想创建一个库,允许使用(DPAPI)System.Security.Cryptography.ProtectedData.Protect()和System.Security.Cryptography.ProtectedData.Unprotect()方法轻松加密存储在配置文件中的敏感数据 我正在制作的一个单独的应用程序也将使用该库,该应用程序可以在使用配置值的应用程序之外加密和解

在每个C#应用程序中都可以找到哪些信息可以用作加密的唯一salt,包括web应用程序、windows服务和wcf层

我想创建一个库,允许使用(DPAPI)
System.Security.Cryptography.ProtectedData.Protect()
System.Security.Cryptography.ProtectedData.Unprotect()方法轻松加密存储在配置文件中的敏感数据

我正在制作的一个单独的应用程序也将使用该库,该应用程序可以在使用配置值的应用程序之外加密和解密配置值,允许更新配置文件,而无需重新编译所有内容或访问原始源,尽管访问源应始终可用

salt必须足够简单,可以在单独的应用程序中手动输入(例如,GUID很难识别)


System.Reflection.Assembly.GetEntryAssembly()
似乎很有希望,如果这是调用我正在创建的库的应用程序/服务的程序集,我可以在其中使用一些东西。最初的想法是“将salt作为加密数据存储在其中的配置文件名…”,但对于网站来说,配置文件总是“web.config”

欢迎有其他想法

更新


“GetExecutionGassembly()”。。。这与“GetEntryAssembly()”有何不同?

每个应用程序/程序集都有一个版本号,这可能是一个选项

System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();

System.Reflection.Assembly.GetEntryAssembly().GetName().Name

似乎是exe或DLL的名称,或者更准确地说,VS2010使用程序集名称作为exe的名称。我需要调查这是如何与网站和服务一起工作的

如果我的加密和解密配置值的外部应用程序(encrypting app)也可以“偷看”请求的程序集的“名称”(使用加密配置的程序),那么使用加密库的任何应用程序都只使用库而不提供salt,并且库可以自己计算程序集名称(指调用它的人)并将其用作salt。如果dll或exe被重命名,我有一种机制来检索程序集名称值,该机制内置于加密应用程序中


p、 我不想将我自己的答案标记为“已接受”,所以请改进我的建议并将其放入您自己的答案中,如果我得到任何好的答案,我将承诺将其中一个标记为“已接受”。

本质上,我们有许多应用程序,版本号不是我们经常使用的,我们有为我们处理版本控制的源代码管理。但是您的answer确实提出了GetExecutionGassembly和GetEntryAssembly之间区别的问题。此外,本质上,这个“salt”应该很容易找到,只需要访问安装应用程序/网站/服务的文件夹和notepad.exe。然后,它可以是公司范围内salt通常使用的价值的策略。version数会随着时间的推移而变化,因此升级后可能无法解密…我猜这是不可取的!对这些方法之间区别的最简单描述是
getExecutionGassembly()
将为您提供“运行代码的程序集”(如果您从.DLL调用,它将为您提供DLL)但是
GetEntryAssembly()
将为您提供“作为进程入口点的程序集”(如果您从.DLL调用,它通常会为您提供运行它的.EXE,甚至可能不是您自己的代码……)@Nnoel如果您控制所有的应用程序,那么创建一个自定义的程序集属性,该属性采用Guid,并在需要salt时在运行时读取。或者甚至没有Guid,只是某个属性中的一堆文本(只有Guid可以让您轻松创建新的Guid).@AdamHouldsworth,听起来你基本上是在建议一个内部值,我需要一个在程序/服务/网站安装并被原作者遗忘后可以识别的值。为什么每个应用程序都需要唯一的salt?或者为什么应用程序的名称不够?如果应用程序名称不合适,则可以使用应用程序名称模棱两可,当程序员用应用程序名加密时,三年后更改配置的支持人员是否会有一个明确的字符串,他可以用notepad.exe作为“应用程序名”来标识,以确保程序员在几年前使用过该字符串?程序集具有[Guid]属性,请在AssemblyInfo.cs中查找。只要您没有复制/粘贴,它是唯一的。始终使用相同的salt值将无法使用salt。@HansPassant,操作人员(即不是开发人员)将无法查看*.cs文件,因为它们不会出现在安装目录中。