2010-06-17 89 views
0

我們有一個使用NTLM進行SSO編寫的.NET應用程序。我們正在用Java編寫一個新的webapp,它將與原始應用程序緊密集成。不幸的是,Java不支持執行NTLM身份驗證的服務器部分,並且我能找到的唯一的庫需要IT設置過多的設置。跨應用程序用戶身份驗證

爲了解決這個問題,我想出了一個遠程認證方案來跨應用程序工作,並希望你的意見。它不需要非常安全,但同時不容易被破壞。

  1. 用戶使用NTLM
  2. 用戶點擊鏈接,離開.NET應用程序
  3. .NET應用程序與用戶的全名一起生成在用戶表中的隨機數,並將其存儲到驗證.NET應用程序(域\用戶名)
  4. 不安全令牌被形成爲隨機數:用戶名
  5. 不安全令牌通過安全密碼運行(使用存儲在應用程序內的預共享密鑰可能AES-256),以產生一個安全令牌
  6. 安全令牌作爲查詢字符串Java應用程序
  7. Java應用程序解密使用存儲在其自己的代碼在同一個預共享密鑰來獲得不安全的令牌
  8. 隨機安全密鑰的一部分傳遞號碼和用戶名被割斷
  9. 的用戶名來檢索用戶表和存儲的隨機數,用戶的信息進行覈查對一個來自不安全的令牌
    • 如果一致,則用戶名拉放入用戶的會話中現在他們正在驗證
    • 如果號碼不匹配,用戶被重定向到.NET應用程序的主頁
  10. 隨機數是從數據庫

回答

1

1)擁有一個預先去除共享密鑰存儲在一個文件(甚至一個程序文件)是劇院,而不是安全。

2)您的令牌(數據庫中的隨機數)應設置爲過期。我建議在一次嘗試後過期,但應該設置時間限制。否則,你可能會得到成千上萬的剩餘令牌,以正確的猜測提供訪問。 3)如果您只需從Java工具驗證允許訪問,則可以使用公鑰加密而不是預共享密鑰。這樣你只需要保護私鑰。當然,保護措施包括:「不要將它放在用戶可以訪問的文件中,並且沒有這種保護,這種方法與預共享密鑰沒有區別。

4)在我看來,Java工具可以很容易地修改,以忽略授權步驟,只是執行任何你試圖保護的敏感任務。

把所有這一切都用在鹽水上,因爲我對Java和.NET知之甚少。儘管我對密碼學有所瞭解。

+0

感謝您的意見。 1.我想我們可以使用預共享密鑰,因爲它們存儲在從服務器運行的應用程序中,也就是說,用戶不能訪問程序代碼,而無需首先訪問他們無法訪問的物理訪問權限或遠程訪問權限的服務器。 2.步驟(11)適用於用戶是否被授予訪問權限。至於時間戳,我們考慮過它,但認爲這對我們的方案來說是過分的。 – 2010-06-18 12:57:48

+0

1)我得到了代碼將在客戶端機器上執行(因此可用)的印象。我的錯。 2)我認爲在任何失敗的比賽中,您隨隨機號碼提供的用戶名除去任何/所有隨機數字標記?這可能是針對用戶的拒絕服務攻擊的載體。感謝您的反饋;這非常有幫助。 – Slartibartfast 2010-06-19 00:42:27