努力了解 authenticode 代码签名和强命名。
如果我对引用一些 dll(非强名称)的 exe 进行代码签名,恶意用户可能会替换我的 DLL 并以一种看起来好像是由我签名的方式分发应用程序,我的想法是否正确,但是正在运行他们的代码?
假设这是真的,似乎您真的不想在不对整个应用程序进行强命名的情况下签署 .NET 应用程序,否则您将让人们能够在您编写的应用程序的伪装下执行代码?
我不确定的原因是,我在网上找到的所有文章(包括关于使用 SN+Authenticode 的 MSDN 文档)似乎都没有提到这一点,这似乎是一个相当重要的理解点(如果我已经理解正确)?
最佳答案
Am I right in thinking that if I code-sign an exe that references a few dlls (not strong named) that a malicious user could replace my DLLs and distribute the app in a way that appears as if it's signed by me, but is running their code?
是的,如果 DLL 的其余部分仅经过签名且没有强命名,则可以在不引发 .NET 异常的情况下替换它们。您可以在 exe 中验证 DLL 是否由与 exe 相同的 key 签名。这些方法都无法阻止他人替换您的 DLL 或 EXE。
Assuming that's true, it seems like you wouldn't really want to sign a .NET app without strong-naming the whole thing, otherwise you're giving people the ability to execute code under the guise of an app you wrote?
一般来说,我认为这是“最佳实践”,但您同样没有阻止任何事情。一旦用户有权更改本地系统上的文件,您就无法阻止他们进行恶意事件。
有几种混淆技术可以将完整的 .NET 项目构建到单个 exe 中,这可能是“最安全”的方法,但仍然可以被篡改。
真正的问题是您要阻止他们做什么?我的意思是,为什么有人会对替换您的 dll 感兴趣?他们希望实现什么,他们的目标是什么?如果您试图阻止某人从流程中读取敏感信息,那么您将走上一条漫长而艰难的失望之路。假设恶意方可以完全访问您的源代码和您的流程使用的每条信息,因为他们确实这样做了。假设他们可以随意替换您的全部或部分代码,因为他们可以。
已更新
So binding redirect will only work with assemblies strong-named with the same key, and therefore does protect you from DLLs being changed?
正确,但值得注意的异常(exception)是代码注入(inject)仍然可以通过多种方式完成。
... and back to the original question, does code-signing without strong-naming kinda undermine the point of code-signing?
不是真的。代码签名(不是强命名)有两个不同的目的:
通常这仅在安装期间进行身份验证和验证。这就是我们签署 setup.exe 的原因,以确保客户收到我们未修改的安装程序。他们收到“您信任 XXXX 公司吗”的提示,从而向经过身份验证/签名的安装程序授予授权。然而,一旦安装,操作系统几乎没有内置使用代码签名(驱动程序和其他一些模糊的情况除外)。
另一方面,强命名的存在有着完全不同的目的。它完全专注于应用程序的“完整性”。没有证书,没有签名机构 (CA) 来验证它,没有用户显示的信息供他们确认,操作系统也无法验证它要运行的可执行文件。
.NET 框架对许多事物使用强名称,所有这些我都粗略地归类为应用程序完整性:
我确定这里还有其他我遗漏的东西,但这些是我知道的主要用途。
签名和强命名的最佳实践
*注意:代码签名在某些情况下对 DLL 很有用,例如标记为“安全”并嵌入到浏览器中的 COM 对象应该像可执行文件一样进行签名和强命名。代码签名还可用于在不加载程序集或反射(reflect)其属性的情况下从外部验证依赖项。
关于c# - 没有强命名的代码签名是否会使您的应用程序容易被滥用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8566755/
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R