2011-06-01 25 views
0

我需要使用當前時間,因爲稍後,另一個程序需要知道我什麼時候生成引腳以及用戶名和密碼是什麼。使用當前時間和用戶名和密碼生成唯一的PIN碼(6位數字)?

總結:

  • 用戶名+密碼+當前時間=銷[6個位數]

  • 反向,產生銷,我需要知道哪個特定,並檢查是否其已經通過1分鐘。

我不是要求直接代碼,但我需要知道最好的,不是最好的,好的方法/算法。謝謝(順便說一句,我是初學者CPP)

編輯:

我不澄清事情抱歉。其實,我需要OTP,在生成引腳後,其他程序將需要像這樣運行:驗證{用戶名} {密碼} {pin}

+0

所有我能想到的,現在產生6位是在基地64生成6位字符串的哈希函數 – Arlen 2011-06-01 08:50:13

+0

@紅色你將無法解碼,然後 – Oleg 2011-06-01 08:53:29

+0

@sehe你的意思是「OTP純粹是隨機的和祕密的」? – Arlen 2011-06-01 08:55:23

回答

5

999999分鐘,給出〜694天,〜1.9年。因此,如果您使用所有可用的熵來記錄當前時間,則可以在不到2年的時間內循環使用該值。

如果你想包括用戶名和密碼,並且避免輕易猜測,情況會更糟糕。

使用6位十進制數字,您可以存儲大約19位數據。因此,您必須確保您的服務器端具有強大的反暴力保護功能,否則嘗試所有可能的組合將會變得微不足道。

One-time passwords沒有內部可解碼結構,它們通常用作普通密碼之外的第二個身份驗證。然後可以基於你所建議的時間,但不可逆 - 另一端也有祕密密鑰,並且可以生成可能的列表本身。

因此,例如,以及輸入用戶名和(正常)密碼,用戶輸入從一個令牌,該令牌作爲AES(secretkey, currentminute)生成的值,和所述服務器計算AES(secretkey, currentminute)AES(secretkey, currentminute-1)等,要與比較值。它也可以記錄哪些令牌匹配,以便記錄令牌時鐘準確度的估計值,只要足夠頻繁地使用它就可以令牌令牌漂移一些時鐘。爲了弄清楚如何最好地使用你在6位數字中的19位數據,你需要一個真正的密碼專家 - 因爲我猜想簡單的截斷可能是不安全的。

+0

感謝您給出答案。對於AES(secretkey,currentminute),AES可以是md5或類似的東西?你有隻有返回數字的散列函數嗎?我認爲md5返回字母數字字符串 – generator 2011-06-01 09:34:44

+0

@generator AES和MD5都只是返回你的位數,你如何編碼它取決於你。您需要使用加密而不是散列,因爲您需要在兩端之間擁有共享密鑰(因爲每個人都知道當前分鐘是什麼)。 – 2011-06-01 11:19:34

+0

謝謝,我想我明白了! – generator 2011-06-01 11:21:40

1

促進我以前的一個答案評論,事後的想法:

我敢肯定它是欺騙,以稱之爲「OTP」。 OTP純粹是隨機的和祕密的。

你描述的是一個簡單的哈希。

你可以

MD5(username+password_hash+(seconds_past_1970%60)) 

我敢肯定,除了使用公鑰加密代替密碼,這或多或少是如何RSA密鑰做到這一點。

編輯哦,是的:這將是非常容易的,從結果散列:)

+0

你會如何做相反的步驟? – duedl0r 2011-06-01 08:55:58

+0

@duedlOr:您無法恢復過程。 6位數字不能保存足夠的信息來編碼所有信息。考慮一個用戶只能使用6位以上的密碼。 – 2011-06-01 09:15:06

+0

@David:我設想的目標是根據已知的共享密鑰驗證服務器上的PIN。我認爲OP知道這不是(不應該是)可逆的,並且他實際上意味着**重複服務器上的步驟**(知道輸入和時間)。顯然,6位數字遠不足以對其進行編碼,除非沒有剩餘熵並且輸入非常簡單......這將導致PIN數以接近純文本的形式暴露祕密。這是絕對無用的,我的回答似乎是正確的建議:) – sehe 2011-06-01 09:23:33

相關問題