簡體   English   中英

存儲公鑰和主密鑰的安全方法是什么?

[英]What is the secure way to store public and primary keys?

我將RSA和RSA加密和解密用於AES,以實現客戶端和服務器的安全通信。 有人告訴我用登錄名用Java硬編碼其關聯的專用密鑰,用Java硬編碼用於登錄的公鑰。 同樣適用於注冊過程,但是登錄和注冊的密鑰對將有所不同。

現在最棘手的部分是,我必須為每個用戶登錄后生成一個密鑰對,並為該特定用戶使用該密鑰對,直到他注銷或會話超時為止。 假設我有1000多個用戶,則每次創建新會話時都必須生成密鑰,並為該用戶維護相同的密鑰對,直到注銷或超時。

這些是我對如何存儲公鑰和私鑰的想法

1)我們必須先定義文件的名稱,然后再將公鑰和私鑰保存到文件中。 我們可以使用登錄用戶的用戶名將其添加到保存的文件中,例如-Dan.Public.key和Dan.Private.key,如果是另一個用戶-Ken.Public.key,Ken.Public.key(Dan和Ken是用戶名)

即使用戶“ Dan”注銷或其會話超時,我的過濾器也會在他再次登錄后創建一個新的私鑰和公鑰,並將該密鑰再次保存到Dan.Public.key和Dan.Private.key,因此它將自動覆蓋同一用戶的上次使用的密鑰文件。 通過定義這樣的文件名,我可以為任意數量的用戶管理它,而不必擔心安全性(當然,我必須完美地配置誰可以訪問keys文件夾)。 談到我的實時問題,我的應用程序是API調用,因此根本沒有會話。 管理會話的唯一方法是通過生成UUID並使用它來維護用戶的會話並保留用戶的日志來處理它。

如果必須為每個調用獲取公鑰和私鑰,則首先必須檢查數據庫以查找與當前UUID關聯的相應用戶名。 從長遠來看,這是一個非常糟糕的方法。 我也可以使用UUID而不是用戶名來給密鑰文件命名,但是這將很快損壞我的服務器,因為唯一的UUID不會覆蓋已保存的文件(無法覆蓋上次使用的密鑰文件,因為每個新的UUID都是唯一的)

2)我可以將公共密鑰和私有密鑰與生成的UUID一起簡單地存儲到數據庫中,因此我可以使用.add(Restrictions.eq("UUID_USER",UUID));來簡單地獲取這些密鑰以進行加密和解密.add(Restrictions.eq("UUID_USER",UUID)); 但是我擔心直接將其存儲在數據庫中時的安全性。

注意:到目前為止,我還不知道如何在數據庫中存儲公鑰和私鑰。

我使用的PBKDF2WithHmacSHA256的迭代計數為100000+,鹽為16個字節,即使黑客獲得了數據庫,也可以防止密碼泄漏。 將密碼存儲的高安全性與直接在數據庫中字符串私有和公鑰的漂亮轉儲概念進行比較,我感到這兩個安全級別之間的差距很大。

我已經讀了一些有關在Keystore中存儲密鑰的知識,但是我不知道它是如何工作的。 如果我選擇將密鑰存儲在數據庫中,是否可以在Java中對這些密鑰使用某種硬編碼的加密和解密,但是這會減慢每次單擊的處理時間,如果記錄更多的用戶,這對於服務器將是沉重的負擔在同一時間。 考慮加密編碼時,我甚至還不是中等水平,但是我不想為一個部分實現一個高安全性的系統,而為另一部分實現0個安全性的系統。 如果以前有人從事過此類應用程序,請與您分享處理公鑰和私鑰存儲方式的方式。

我假設用戶密鑰用於對從客戶端發送到服務器的數據進行簽名或對從服務器發送到客戶端的數據進行加密。

您確實不應該將用戶的私鑰存儲在服務器上(或為此生成)。 最好在客戶端上生成密鑰對,並將公共密鑰發送到使用服務器的公共密鑰加密的服務器。

服務器(和開發人員/運營商)從不接收用戶私鑰,也無法模擬用戶。 每次用戶登錄時,都會生成一個新的密鑰對,並且公共密鑰將在數據庫中被覆蓋。

請注意,這不能完全保護您免受攻擊,因為基於網絡的攻擊者可能只是注入其他JavaScript來竊取用戶私鑰或指示客戶端將所有信息直接發送給攻擊者。 解決此問題的唯一方法是使用SSL / TLS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM