我需要使用當前時間,因爲稍後,另一個程序需要知道我什麼時候生成引腳以及用戶名和密碼是什麼。使用當前時間和用戶名和密碼生成唯一的PIN碼(6位數字)?
總結:
用戶名+密碼+當前時間=銷[6個位數]
反向,產生銷,我需要知道哪個特定,並檢查是否其已經通過1分鐘。
我不是要求直接代碼,但我需要知道最好的,不是最好的,好的方法/算法。謝謝(順便說一句,我是初學者CPP)
編輯:
我不澄清事情抱歉。其實,我需要OTP,在生成引腳後,其他程序將需要像這樣運行:驗證{用戶名} {密碼} {pin}
我需要使用當前時間,因爲稍後,另一個程序需要知道我什麼時候生成引腳以及用戶名和密碼是什麼。使用當前時間和用戶名和密碼生成唯一的PIN碼(6位數字)?
總結:
用戶名+密碼+當前時間=銷[6個位數]
反向,產生銷,我需要知道哪個特定,並檢查是否其已經通過1分鐘。
我不是要求直接代碼,但我需要知道最好的,不是最好的,好的方法/算法。謝謝(順便說一句,我是初學者CPP)
編輯:
我不澄清事情抱歉。其實,我需要OTP,在生成引腳後,其他程序將需要像這樣運行:驗證{用戶名} {密碼} {pin}
999999分鐘,給出〜694天,〜1.9年。因此,如果您使用所有可用的熵來記錄當前時間,則可以在不到2年的時間內循環使用該值。
如果你想包括用戶名和密碼,並且避免輕易猜測,情況會更糟糕。
使用6位十進制數字,您可以存儲大約19位數據。因此,您必須確保您的服務器端具有強大的反暴力保護功能,否則嘗試所有可能的組合將會變得微不足道。
One-time passwords沒有內部可解碼結構,它們通常用作普通密碼之外的第二個身份驗證。然後可以基於你所建議的時間,但不可逆 - 另一端也有祕密密鑰,並且可以生成可能的列表本身。
因此,例如,以及輸入用戶名和(正常)密碼,用戶輸入從一個令牌,該令牌作爲AES(secretkey, currentminute)
生成的值,和所述服務器計算AES(secretkey, currentminute)
和AES(secretkey, currentminute-1)
等,要與比較值。它也可以記錄哪些令牌匹配,以便記錄令牌時鐘準確度的估計值,只要足夠頻繁地使用它就可以令牌令牌漂移一些時鐘。爲了弄清楚如何最好地使用你在6位數字中的19位數據,你需要一個真正的密碼專家 - 因爲我猜想簡單的截斷可能是不安全的。
促進我以前的一個答案評論,事後的想法:
我敢肯定它是欺騙,以稱之爲「OTP」。 OTP純粹是隨機的和祕密的。
你描述的是一個簡單的哈希。
你可以
MD5(username+password_hash+(seconds_past_1970%60))
我敢肯定,除了使用公鑰加密代替密碼,這或多或少是如何RSA密鑰做到這一點。
編輯哦,是的:這將是非常容易的,從結果散列:)
你會如何做相反的步驟? – duedl0r 2011-06-01 08:55:58
@duedlOr:您無法恢復過程。 6位數字不能保存足夠的信息來編碼所有信息。考慮一個用戶只能使用6位以上的密碼。 – 2011-06-01 09:15:06
@David:我設想的目標是根據已知的共享密鑰驗證服務器上的PIN。我認爲OP知道這不是(不應該是)可逆的,並且他實際上意味着**重複服務器上的步驟**(知道輸入和時間)。顯然,6位數字遠不足以對其進行編碼,除非沒有剩餘熵並且輸入非常簡單......這將導致PIN數以接近純文本的形式暴露祕密。這是絕對無用的,我的回答似乎是正確的建議:) – sehe 2011-06-01 09:23:33
所有我能想到的,現在產生6位是在基地64生成6位字符串的哈希函數 – Arlen 2011-06-01 08:50:13
@紅色你將無法解碼,然後 – Oleg 2011-06-01 08:53:29
@sehe你的意思是「OTP純粹是隨機的和祕密的」? – Arlen 2011-06-01 08:55:23