快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

澳门新莆京app官网:受限用户问题和分持机密



本文示例源代码或素材下载

本月我将回答更多的读者问题。我将评论争论在通俗用户帐户下运行的 Windows Communication Foundation Web 办事以及应用分持机密技巧和双重密钥节制来保护信用卡数据等问题。

问:当我以非治理员的身份运行简单的 Windows® Communication Foundation 办事时,为何无法启动?

问:当我以非治理员的身份运行简单的 Windows® Communication Foundation 办事时,为何无法启动?

答:首先我想说的是,很痛快听到您在通俗用户帐户下测试代码!这是开拓职员不应轻忽的测试事情的一个紧张方面。

答:首先我想说的是,很痛快听到您在通俗用户帐户下测试代码!这是开拓职员不应轻忽的测试事情的一个紧张方面。

现在,对付那些想彻底查清此类问题的用户,我保举的第一个措施是启动 Filemon 和 Regmon,查找文件打开操作掉败的记录或查找注册表项,这两个对象可以从 Sysinternals(近来被 Microsoft 收购)的网站 www.sysinternals.com 得到。遗憾的是,这些对象不能诊断所有可能导致此问题的要害所在。纵然在 Windows Communication Foundation 中实施的侦听 HTTP 通道这类最简单的 Web 办事,默认环境下,也不能以通俗用户身份来运行,除非 Windows Communication Foundation 以 IIS 作为宿主。这是由于 Windows Communication Foundation HTTP 通道应用 HTTP.SYS 驱动法度榜样安装其侦听法度榜样,而且 HTTP.SYS 不容许非治理员在没有治理员明确授权的环境下,注册侦听法度榜样。

为阐明此问题,我构建了一个包孕以下两个文件的简单 Web 办事:该办事的源文件和利用法度榜样设置设置设备摆设摆设文件。图 1 显示了该办事的代码。在您以治理员身份启动该办事时,统统正常。但以通俗用户身份运行该办事时,则呈现大年夜问题!图 2 显示了在应用 Microsoft® .NET Framework 3.0 Beta 2 版时发生的非常环境。

Figure2Exception When Run as Normal User

System.ServiceModel.Diagnostics.CallbackException: A user callback threw an exception. Check the exception stack and inner exception to determine the callback that failed.

---> System.NullReferenceException: Object reference not set to

an instance of an object.

at System.ServiceModel.Channels.DatagramChannelDemuxer`2.

OnListenerClosed(Object source, EventArgs args)

at System.ServiceModel.Channe澳门新莆京app官网ls.CommunicationObject.OnClosed()

--- End of inner exception stack trace ---

at System.ServiceModel.Channels.CommunicationObject.OnClosed()

at System.ServiceModel澳门新莆京app官网.Channels.CommunicationObject.Abort()

at System.ServiceModel.Channels.ChannelListenerBase.OnAbort()

at System.ServiceModel.Channels.SecurityChannelListener`1.OnAbort()

at System.ServiceModel.Channels.CommunicationObject.Abort()

at System.ServiceModel.Channels.ChannelListenerBase.OnAbort()

at System.ServiceModel.Channels.CommunicationObject.Abort()

at System.ServiceModel.Dispatcher.ChannelDispatcher.OnAbort()

at System.ServiceModel.Channels.CommunicationObject.Abort()

at System.ServiceModel.ServiceHostBase.OnAbort()

at System.ServiceModel.Channels.CommunicationObject.Abort()

at System.ServiceModel.Channels.CommunicationObject.Close(

TimeSpan timeout)

at System.ServiceModel.Channels.CommunicationObject.Close()

at System.ServiceModel.Channels.CommunicationObject.Dispose()

at Program.Main(String[] args) in

C:workHelloServiceProgram.cs:line 24

Figure1Simple Web Service Source Code

这个问题不难办理 — 您只需治理员经由过程 HTTP.SYS 向您的利用法度榜样赋予所谓的命名空间保留项。在进行这种授权时,治理员实际上是在说:“用户可以侦听应用我指定的 URL 前缀的 HTTP 哀求。”治理员可以将侦听权限赋予单个用户或一个组。

您的安装法度榜样可以应用 HTTP API 以编程要领赋予命名空间保留项,不过遗憾的是,HTTP API 还没有公用的 .NET 包装法度榜样。图 3 显示了一些样本代码,假如您在 C# 情况下事情,则可以应用这些代码来入门。这个特其余样本代码必要按名称来通报用户或组账户,而且必须由本地治理员组的某个成员来履行。此代码也应用 P/Invoke 调用 HTTP API,这意味着就“公共说话运行库”(Common Language Runtime,简称 CLR)中基于证据的安然性而言,代码必要在完全受相信的环境下运行。假如您是在 Microsoft Installer 中对其打包,则不会呈现问题。但假如您试图在通俗用户帐户下,经由过程一个以部分相信要领运行的下载利用法度榜样来履行此操作,则问题照样得不到办理。

Figure3Programatically Granting a Namespace Reservation

using System;

using System.Xml;

using System.Security.Principal;

using System.Runtime.InteropServices;

public class ReserveHttpNamespace {

static void Main(string[] args) {

if (args.Length != 2) {

Console.WriteLine(

"Usage: reserveHttpNamespace " +

"prefix account");

return;

}

try {

ModifyReservation(args[0], args[1], false);

Console.WriteLine("Success!");

}

catch (Exception x) {

Console.WriteLine(x.Message);

}

}

static void ModifyReservation(

string urlPrefix, string accountName,

bool removeReservation) {

string sddl = createSddl(accountName);

HTTP_SERVICE_CONFIG_URLACL_SET configInfo;

configInfo.Key.UrlPrefix = urlPrefix;

configInfo.Param.Sddl = sddl;

HTTPAPI_VERSION httpApiVersion =

new HTTPAPI_VERSION(1, 0);

int errorCode = HttpInitialize(httpApiVersion,

HTTP_INITIALIZE_CONFIG, IntPtr.Zero);

if (0 != errorCode)

throw getException("HttpInitialize", errorCode);

try {

// do our best to delete any existing ACL

errorCode = HttpDeleteServiceConfigurationAcl(

IntPtr.Zero, HttpServiceCon澳门新莆京app官网figUrlAclInfo,

ref configInfo, Marshal.SizeOf(

typeof(HTTP_SERVICE_CONFIG_URLACL_SET)),

IntPtr.Zero);

if (removeReservation) {

if (0 != errorCode) throw getException(

"HttpDeleteServiceConfigurationAcl",

errorCode);

return;

}

errorCode = HttpSetServiceConfigurationAcl(

IntPtr.Zero, HttpServiceConfigUrlAclInfo,

ref configInfo, Marshal.SizeOf(

typeof(HTTP_SERVICE_CONFIG_URLACL_SET)),

IntPtr.Zero);

if (0 != errorCode) throw getException(

"HttpSetServiceConfigurationAcl", errorCode);

}

finally {

errorCode = HttpTerminate(

HTTP_INITIALIZE_CONFIG, IntPtr.Zero);

if (0 != errorCode) throw getException(

"HttpTerminate",errorCode);

}

}

static Exception getException(string fcn, int errorCode) {

return new Exception(

string.Format("{0} failed: {1}",

fcn, getWin32ErrorMessage(errorCode)));

}

static string createSddl(string account) {

string sid = new NTAccount澳门新莆京app官网(account).Translate(

typeof(SecurityIdentifier)).ToString();

// DACL that allows generic execute for the user

// specified by account.

// See help for HTTP_SERVICE_CONFIG_URLACL_PARAM

// for details on what this means.

return string.Format("D:(A;;GX;;;{0})", sid);

}

static string getWin32ErrorMessage(int errorCode) {

return Marshal.GetExceptionForHR(HRESULT_FROM_WIN32(errorCode));

}

static int HRESULT_FROM_WIN32(int errorCode) {

if (errorCode

您还可以应用一款名为 HTTPCFG.EXE 的对象,该对象可以在操作系统安装磁盘的 SUPPORT 子目录下的各类支持对象中找到。您可以应用此对象列呈现有的命名空间保留项,如:

假如您转头查看图 1,可以看到我向 ServiceHost 注册的基址是 localhost:8080/MyServices/。遗憾的是,假如您的目的很直不雅,只是想应用 HTTPCFG 来明确注册此 URL 前缀,则无法达到目的。这是由于实际上,Windows Communication Foundation 要注册的是一个强通配符,它可以“撒下更大年夜的网”,而这是详细的主机名注册项所无法涵盖的。您必要改用强通配符语法,注册 http://+:8080/MyServices/ 形式的 URL 前缀。不管是经由过程编程要澳门新莆京app官网领照样经由过程 HTTPCFG 对象完成这一操作,都要这样做。

很多人在以治理员身份运行的环境下编写代码。但遗憾的是,直到在非特权情况下支配代码时,他们才会留意到这个问题,这也便是应该始终以非治理员身份测试代码的一个缘故原由。但更好的做法是,您可以考试测验在以非治理员身份运行的环境下编写代码!我不会就这个问题展开评论争论,但假如您有兴趣懂得以非治理员身份进行开拓事情的具体信息,请查看 Aaron Margosis 的博客,作者在此中专就此话题颁发了多篇文章。

问:实施分持机密和双重密钥节制的最好要领是什么?

问:实施分持机密和双重密钥节制的最好要领是什么?

答:很多网站吸收信用卡持卡人数据,包括信用卡卡号、帐单邮寄地址,等等。在 2004 年下半年,颁布了一个名为“支付卡行业数据安然标准”(PCI-DSS) 的行业标准,对存储、处置惩罚或传输此类数据的公司做出了安然方面的规定。此中的 3.6.6 节提出了一个新要求,内容是:“分持机密和双重密钥节制(即密钥由两、三小我分持,每小我只知道部分密钥,所有人凑在一路才能重修全部密钥)。”

答:很多网站吸收信用卡持卡人数据,包括信用卡卡号、帐单邮寄地址,等等。在 2004 年下半年,颁布了一个名为“支付卡行业数据安然标准”(PCI-DSS) 的行业标准,对存储、处置惩罚或传输此类数据的公司做出了安然方面的规定。此中的 3.6.6 节提出了一个新要求,内容是:“分持机密和双重密钥节制(即密钥由两、三小我分持,每小我只知道部分密钥,所有人凑在一路才能重修全部密钥)。”

原型评测是一个分层的办理规划,其根基是一个名为 SecretSplitter 的类中的两个核心函数。这些函数应用了我在前文描述的技巧来拆分或连接消息。图 4 显示了这些函数的代码。第一个函数 SplitSecret 吸收两个参数:一个字节数组和一个整数,前者代表要拆分的消息,后者代表要拆分出的密钥数量。JoinSecret 函数吸收一个包孕拆分的密钥的数组,并将这些密钥连接起来,获得原始消息。假如不能供给最初拆分时的准确密钥,您获得的结果将与原始消息有所不合。

Figure4Splitting and Joining a Message

public static List SplitSecret(byte[] secret, int count) {

if (null == secret || 0 == secret.Length)

throw new ArgumentException("Non-empty value required",

"secret");

if (countnewSecrets = new List(count);

for (int i = 0; isplitSecrets) {

if (null == splitSecrets) throw new ArgumentNullException();

byte[] secret = null;

foreach (byte[] splitSecret in splitSecrets) {

if (null == splitSecret) throw new ArgumentNullException();

if (null == secret) {

secret = (byte[])splitSecret.Clone();

continue;

}

if (splitSecret.Length != secret.Length)

throw new ArgumentException(

"All secrets must be of the same length");

// XOR all the split secrets together to get the original secret.

for (int i = 0; i

请留意应用 RNGCryptoServiceProvider 类天生密钥的措施。这种技巧比应用 System.Random 一类的对象要好得多。RNGCryptoServiceProvider 是专门设计用来为加密操作天生随机数据的,是以其在弗成猜测性方面要强于由 System.Random 一类对象天生的数据流。它也是由谋略机上多个匀称信息量的源自我天生的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: