2011-09-20 201 views
8

是否可以通過Web瀏覽器創建需要公鑰/私鑰的登錄進程?公鑰將被存儲在服務器上,並且私鑰將被用戶保存(和加密)。基於Web的登錄使用SSL公鑰/私鑰?

我基本上想做類似於SSH的事情,但通過網絡。也許是HTTP身份驗證的一種自定義方法(「摘要」除外)。

我知道使用股票瀏覽器可能無法做到這一點,因此可以接受使用此工作的擴展程序(Chrome/Firefox)。

理想情況下,密鑰將在USB棒上加密。當USB拔出時不得不無法登錄(不希望瀏覽器緩存它)。

這將在內部使用。

編輯:客戶端證書將是我正在尋找的,但是如何將這些證書存儲在USB記憶棒上?另外,有沒有關於如何使用PHP認證用戶的信息?

+0

這是可能的,但有時挑剔。 Google提供「SSL客戶端證書」。 –

+0

我將如何使證書便攜/可移動(存儲在USB棒上)? – Luke

+0

通常,證書將安裝到特定的瀏覽器配置文件中。脫機證書功能必須由瀏覽器支持。或者,您可以使用Firefox的「便攜式」安裝,或者將整個瀏覽器及其所有配置文件信息(包括客戶端證書)存儲在USB存儲棒中的東西。 –

回答

4

這是通過證書的客戶端身份驗證。
您的服務器應配置爲需要客戶端證書,並且配置爲使用信任庫。
所有瀏覽器都支持此功能。
您只需將具有私鑰和證書的客戶機密鑰庫導入機器證書集。
對於Windows,它是在互聯網上的選項

+1

如何在OS X上的Chrome中進行設置?我希望證書位於可移動USB存儲棒上。我怎麼做到這一點? – Luke

+0

Chrome/Mac將OS X鑰匙串用於客戶端SSL證書。我不認爲有可能將它們保留在外部驅動器上(儘管我可能是錯的)。 – Quentin

2

我懷疑你可以用Web應用程序來做到這一點。瀏覽器在操作系統中被沙盒化,您將無法讓Web應用程序檢測到USB驅動器的存在,也無法使用Web應用程序讀取任何數據。所以你需要瀏覽器爲你做這件事,而且他們不是這樣設計的。

當您將客戶端證書加載到瀏覽器時,它將被加載到證書存儲中。這些根據瀏覽器和操作系統而不同。在OSX上他們進入KeyChain。在Windows上,一些將進入OS密鑰存儲,一些將進入瀏覽器自己的密鑰存儲(Firefox我相信這樣工作)。但是它們都不允許你定義一個外部密鑰庫,然後加密和解密你試圖保護的密鑰,因爲它從該驅動器讀取和寫入。

如果你爲自己編寫了自己的桌面應用程序(本質上是你自己的瀏覽器),你所做的只會是可能的。

您可以使用Adobe AIR應用程序完成此操作。 Adobe AIR支持從USB驅動器讀取和寫入數據,它支持加密數據庫(使用SQLite的128位AES/CBC加密),您可以在其中存儲要保護的數據,並且它是跨平臺的。

使用這些解決方案中的任何一種,您都可能在需要確保USB密鑰插入時停止使用。這可能很難做到。您如何阻止用戶將文件從USB密鑰複製到硬盤,然後使用該密鑰,以便他們不需要使用USB密鑰?

要達到這種控制水平,您可能需要查看真正的本地解決方案。 C++,Objective-C或Java。 Java將成爲唯一一個爲您提供跨平臺解決方案的平臺。

如果USB密鑰對最終用戶而言是一種方便,而不是要求,那麼Adobe AIR將是一個可靠的解決方案。如果不是的話,那麼現在是時候刷新你的桌面軟件開發技能。

+0

即使在OS X上,Firefox也使用它自己的密鑰存儲。Firefox中有「安全設備」,允許您使用智能卡,這是一種在外部存儲私鑰的方式。 Firefox將此稱爲PKCS#11。我不清楚如何設置它。 PKCS#12應該是一個便攜式解決方案。但我不確定Firefox是否支持這一點。這就是我迄今爲止所發現的,但我無法弄清楚如何設置這一點。我不確定Firefox是否支持PKCS#12。防止用戶複製密鑰不是問題,因爲它是非常短的用戶列表。只是不希望瀏覽器這樣做。 – Luke

+0

確實,謝謝你指出。智能卡是可以與許多應用程序配合使用的解決方案。我從海報中得到了這樣的印象,那不是他想要走的路線,但將它作爲一個選項提出來是有道理的。如果OP願意拋棄現金來購買智能卡解決方案,那麼這可能是一條可行的路。 –

0

客戶證書是答案。大多數/所有瀏覽器都將這些客戶端證書導入爲PKCS#12(.p12,.pfk)。

您可以使用公鑰(.crt),私鑰(.key)和CA證書(.crt)將現有的x509證書轉換爲PKCS#12文件。您可以使用下面的命令與OpenSSL的做到這一點:

openssl pkcs12 -export -out client.p12 -inkey client.key -in client.crt -certfile ca.crt 

如果自簽名證書,它以確保證書的序列比其他證書的不同是很重要的。如果它們相同,則可能會嘗試導入.p12文件時遇到錯誤(因此請注意openssl示例中的-set_serial)。

不幸的是,證書移動/可移動唯一的跨平臺方式是使用智能卡(使用PKCS#11)。

在Mac OS X上,Safari和Chrome從鑰匙串中訪問其證書。您實際上可以在USB閃存驅動器上創建自定義鑰匙串(文件 - >新鑰匙串)。創建鑰匙串後,您只需將.p12文件拖入您的鑰匙串即可。有關這方面的好處是,您可以控制對訪問證書的應用程序的訪問權限,並且您可以在發生一定的不活動狀態後鎖定鑰匙串本身。

用Safari瀏覽器可以很好地工作。如果拔下閃存驅動器,它會在幾秒鐘後停止發送該證書。如果你重新插入它,它會馬上拿起它。如果您使用「鑰匙串訪問」鎖定證書,它將要求輸入密碼。它可以防止您在使用過程中正確彈出閃存驅動器,但一分鐘後Safari釋放它的鎖定。

鉻是finicky。它將證書緩存幾分鐘。如果鎖定鑰匙串,它將繼續使用緩存版本。如果您嘗試正確卸載閃存驅動器,它會告訴您Chrome正在使用它,直到您關閉它。如果您在Chrome運行時插入閃存驅動器,則無法啓動。

因此,看來Safari是唯一支持此功能的瀏覽器。 Firefox和Opera都有自己的密鑰存儲區。

如果你想隱藏你的閃存驅動器上的自定義鑰匙串,你可以創建一個不可見的文件夾前加一段時間(如「./.keys」)。創建鑰匙串時,您可以通過按Command + Shift +「。」查看對話窗口中的不可見文件夾。

1

您的問題的答案是「今天不可能」。

該技術今天已經以所有瀏覽器已經支持的證書形式出現。但要獲得您想要的內容,瀏覽器必須允許在其用戶界面的「密碼管理器」部分添加和管理證書。人們希望在設備之間同步它們。

此外,網站需要進行類似的更改,以便用戶能夠管理存儲在網站上的公鑰,而不是管理其密碼。

這種系統的好處是你永遠不必將密碼(私鑰)發送到你登錄的網站。但除此之外,您仍然擁有您今天使用密碼進行的所有管理活動。

2

這是我如何使用PHP的RSA公鑰/私鑰做基於網絡的登錄:

  • 在註冊,服務器存儲用戶的公鑰和給用戶一個ID
  • 在登錄時,用戶會被要求輸入他的ID和私鑰

註冊非常簡單。

  • 服務器生成一個包含一些數據的字符串:隨機字符串,當前時間,用戶的IP
  • 該字符串與AES有兩個密碼加密兩次:

    但登錄是這樣做的話nonce1 = pass2(pass1(string))

  • 相同的字符串與AES加密,再有兩個密碼,但以相反的順序:nonce2encrypted = encryptPubKeyRSA(userPubKey, nonce2)
nonce2 = pass1(pass2(string)),並將結果與​​用戶的公鑰進行加密

P.S.該字符串使用兩個密碼加密,難以進行暴力攻擊。

登錄表單包含三個隱藏的輸入:nonce1,nonce2encryptednonce2沒有值。

然後用戶被要求在一個textarea是外<form>標籤(以確保它不會被髮送到服務器上的表單提交),一個JavaScript將解密nonce2encrypted並設置解密進入他的私人密鑰值爲nonce2。然後,帶有私鑰的textarea被從javascript中刪除,只是爲了確保它不會被存儲在瀏覽器的某個地方或發送到服務器。

服務器收到nonce1nonce2,並用這兩個密碼解密它們。如果解密值相同,則用戶接收cookie並登錄。

P.S.該cookie還包含一些加密數據,例如用戶ip。這不允許有人竊取這個cookie從另一個ip登錄。

您可以view this method in actionproject on github