代码之家  ›  专栏  ›  技术社区  ›  Rob Prouse

如何防止未经授权的代码访问.NET 2.0中的程序集?

  •  6
  • Rob Prouse  · 技术社区  · 16 年前

    StrongNameIdentityPermissionAttribute 以确保只有由您签名的代码才能访问程序集。根据MSDN文件,

    如果调用程序集具有完全信任,则权限无效。

    如何防止未经授权的代码访问.NET 2.0中的程序集?

    3 回复  |  直到 13 年前
        1
  •  5
  •   Rob Prouse    16 年前

    根据埃里克的建议,我自己检查钥匙解决了这个问题。在我要保护的代码中,我添加了以下调用,

    EnsureAssemblyIsSignedByMyCompany( Assembly.GetCallingAssembly() );
    

    然后介绍了该方法的实现

      /// <summary>
      /// Ensures that the given assembly is signed by My Company or Microsoft.
      /// </summary>
      /// <param name="assembly"></param>
      private static void EnsureAssemblyIsSignedByMyCompany( Assembly assembly )
      {
         if ( assembly == null )
            throw new ArgumentNullException( "assembly" );
    
         byte[] pubkey = assembly.GetName().GetPublicKeyToken();
         if ( pubkey.Length == 0 )
            throw new ArgumentException( "No public key token in assembly." );
    
         StringBuilder builder = new StringBuilder();
         foreach ( byte b in pubkey )
         {
            builder.AppendFormat( "{0:x2}", b );
         }
         string pkString = builder.ToString();
         if ( pkString != "b77a5c561934e089" /* Microsoft */ &&
              pkString != "abababababababab" /* Ivara */ )
         {
            throw new ArgumentException( "Assembly is not signed by My Company or Microsoft. You do not have permission to call this code." );
         }
      }
    

        2
  •  1
  •   Community Mohan Dere    5 年前

    见本文:
    http://blogs.msdn.com/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

    在.NET的最新版本中,“完全信任意味着完全信任”。也就是说,完全受信任的代码满足所有要求,包括“使用此密钥签名”之类的要求,不管它是否实际被签名。

    这难道不是安全系统中的致命缺陷吗?不可以。完全信任的代码总是能够做到这一点,因为完全信任的代码能够控制与给定程序集关联的证据。如果你能控制证据,那么你就可以伪造一个看起来像来自微软的程序集,没问题。(如果您的进程中已经有恶意的完全信任代码,那么您已经丢失了——它不需要模拟Microsoft签名的程序集;它已经有能力执行用户可以执行的任何操作。)

    显然,.Net设计人员认为该属性对于.NET1.x中的完全信任代码也不是很有效。

        3
  •  1
  •   Eric Rosenberger    16 年前

    正如乔尔指出的,你在CAS方面运气不佳。但是,通过使用Assembly.GetCallingAssembly()获取对包含调用代码的程序集的引用,然后手动检查该程序集上的强名称,您可以在需要保护的任何方法中自己进行检查。

    推荐文章