2015-03-13 163 views
1

當使用ChannelFactory類或生成的代理服務器訪問WCF服務時,是否可以在客戶端計算機上保護客戶端密碼?保護客戶端機器上的客戶端密碼

注意:我不是在談論通過線路保護密碼。而是問我是否有可能在客戶端機器上保護密碼,以便在用戶通過客戶端應用程序登錄時有人不能使用工具來公開密碼。

我相信這是一個不可能實現的目標。無論我如何從用戶獲取並保護密碼 - 在ChannelFactory或代理對象上設置ClientCredentials時,密碼都會暴露。

例如一個ChannelFactory對象上設置ClientCredentials時:

var myChannelFactory = new ChannelFactory<IMyService>(myBinding, myEndpoint); 
myChannelFactory.Credentials.UserName.UserName = GetUserName(); 
// Password will be set on channel factory as a string 
myChannelFactory.Credentials.UserName.Password = GetPassword(); 

只要ChannelFactory實例是在存儲器中,則密碼是不安全的,如果有人具有客戶端計算機。我知道加密可以被破壞,並且將任何文件放入正確的手中意味着它可以被破壞。但是,我想知道是否至少可以讓某人爲之工作 - 但這似乎是一個漏洞,限制了開發人員在客戶機器實際訪問時可以保護系統的情況。

使用用戶名/密碼身份驗證訪問服務時,這只是一個事實嗎?

+0

根據我的經驗,如果客戶身體受到傷害,所有投注都無濟於事。 – 2015-03-13 18:31:14

+0

是的,我同意它離理想情況很遠。我發現問題的根源在於客戶端憑證必須以某種方式傳遞,以便服務知道如何解釋可預測的知識 - 共享祕密的知識必須位於客戶端的某個位置。 – 2015-03-13 19:21:41

+0

您可能可以使用自定義身份驗證模塊與採用用戶名和密碼並返回API密鑰的服務結合使用(此服務除使用SSL之外不會受到保護),然後將API密鑰放入用戶名中並離開密碼空白並根據授權密鑰列表進行驗證。確保您清除原始憑據。如果API密鑰使用某種類型的機器本地標識數據進行編碼,那麼至少您可以限制API密鑰的使用,只要該密鑰有效即可。 – 2015-03-13 19:24:25

回答

0

如果您在客戶端機器上使用了密碼散列,然後將其與WCF服務上的散列匹配,該怎麼辦?這樣你就可以存儲和發送散列。

我也做了它,我會存儲散列,但是當我去使用它時,我會將它與DateTime.UtcNow.ToString(「DDHH」)(日+小時)並再次散列它。如果它在WCF端沒有匹配,我會使用前一小時和後一小時重新檢查。 see here for hashing.