2011-08-18 30 views
0

我正在查看是否有可能在兩個不同的java代碼中生成兩個相同的字母數字字符串。這是爲了客戶端和服務器之間的安全通信。在不同的java程序中生成兩個相同的隨機字母數字字符串

或者是否有其他方法可以做到這一點?

我查看了公共私鑰加密和相關內容的常用方法。對於我的要求,我不需要像過多的標準東西那樣的機制。我有點像尋找一個簡單的選擇。

感謝, Abishek

回答

0

我認爲你在尋找什麼是類似於一個time-synchronized one-time password

一個簡單的方法是使用四捨五入到最接近的6秒「脈衝」作爲加密安全隨機數生成器(Java提供SecureRandom FWIW)的種子的系統時間。然後,與預先共享的「祕密」一起通過單向加密哈希(例如SHA256)生成您的字母數字(十六進制或base64)字符串。

如果你不需要顯示/傳遞實際的字符串,那麼我想你可以跳過散列步驟,只是使用共享密鑰和同步時間作爲應用於通信的密碼的IV +密鑰兩端流。

這種方法的明顯風險或複雜性是保持兩個系統時鐘同步。如果您使用NTP或其他時間同步協議,那麼您也必須保證這一點(否則您可能會面臨重播攻擊)。標準的計算機時鐘很容易出現漂移(因此6秒的窗口),你也必須保證它們不被篡改。

(免責聲明:我不是一個安全專家,所以不要想了一會兒說什麼我已經概述的,是完全安全/安全的,因爲是。)

+0

剛剛意識到即使只是系統時間和'祕密'應該足以生成合理安全的加密哈希(不需要隨機數生成)。此外,另一個可能的風險是如果知道「祕密」,則可以相對容易地猜測系統時間(四捨五入),從而允許竊聽者破解密碼。不過,在接受之後不想編輯我的原始答案。 –

0

你也可以看看密鑰交換協議如Diffie-Hellman。這裏所交換的「密鑰」是密碼強的隨機數發生器的種子,並且在這方面與真實的加密密鑰幾乎沒有區別。

0

如果兩個不同的系統正在生成相同的字符串,那麼生成器通常不會具有密碼安全性。一旦攻擊者知道輸入信息,她將能夠生成相同的字符串,並且輸入將是像Alistair所建議的那樣的當前日期/時間。

這不是一個新問題,它已經被解決了。彼得指出你在Diffie-Hellman,這是一個標準的安全解決方案,用於在不安全的線路上建立共享密鑰(即密鑰)。

相關問題