?
快捷搜索:  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 得到。遺憾的是,這些對象不能診斷所有可能導致此問題的要害所在??v然在 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 一類對象天生的數據流。它也是由謀略機上多個勻稱信息量的源自我天生的。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户