2017-06-08 88 views
-1

我正在倒轉一個應用程序,但我不是AES算法的專家。 該應用程序爲用戶提供了進行離線登錄的機會。AES-256最佳實踐實施

用戶會被要求提供他用戶名密碼

這是一個用來存儲用戶

public void EncryptLoginInfo(string username, byte[] secretShared, byte[] salt) 
{ 
    byte[] random = calc.GenerateRandomBytes(); 
    byte[] array = aes.Encrypt(secretShared, random); 
    OfflineLogin loginInfo = new OfflineLogin() 
    { 
    Username = username, 
    SecretShared = array, 
    Iv = random, 
    Salt = salt 
    }; 
    this._userCredentials.StoreOfflineLoginData(username, loginInfo); 
} 

的信息的功能,這是存儲在應用的內部配置文件中的信息。在下面的例子中,密碼傳遞給encryptLoginInfo

Username: not_important 
SecretShared: 4KVrjy1cQVWYpWF7aolpMS0HzhKyFf+9VXauQrXoXVUbf0bGXIDOLDJuSVhYoFo2 
Iv:yil4nn02IoKsOnX5KXVsDg== 
Salt: 5kJio2VQEqjomHRdQMqRVJ0zkBsmqi8K3NypC2VWJk4 

如果用戶想使離線登錄,他被要求提供用戶名和他的密碼。

問題:這個算法安全嗎?如果攻擊者能夠獲得SecretShared + IV +鹽是他能夠恢復用戶的密碼(在這個具體的例子是)

這是解密函數

public void DencryptLoginInfo(OfflineLogin loginInfo) 
{ 
    byte[] array = aes.Decrypt(loginInfo.SecretShared, loginInfo.Iv); 
    loginInfo.SecretShared = array; 
    loginInfo.Iv = (byte[]) null; 
} 

是你能夠發現這個實現中的任何安全問題? 使用的算法應該是AES-256。。你能夠在python中實現POC來解密給定SecretShared + Iv + Salt的PASSWORD嗎?

+3

你究竟想達到什麼目的?您是通過加密*東西來驗證用戶身份嗎?還是實際上是使用用戶的密碼加密有用的數據?請記住,Stack Overflow處理與您的問題不適合的編程有關的問題。 –

+0

通過加密他的密碼來驗證用戶 – paolino

+1

@paolino你不應該加密他的密碼,而應該使用基於密碼的密鑰派生函數對它進行哈希處理。好的,請修正你的問題,然後我可以修復我的答案。 – TheGreatContini

回答

1

根據您的評論,您的目標是驗證用戶。爲此,我們在密碼上使用密碼基密鑰派生函數。通常人們稱之爲「哈希密碼」,這是不幸的術語,因爲「哈希」可能意味着什麼。但重點是我們不加密密碼,而是通過設計緩慢的單向函數發送它們。緩慢的速度阻礙了蠻力攻擊。

你不需要IV來做到這一點。相反,您的應用程序應該派生鹽並使用基於密碼的密鑰派生函數(有時稱爲「密碼哈希」算法:您將不得不原諒該行業已經弄糊塗了關於此主題的術語) 。你可以在網上找到這方面的指導。但我建議您閱讀point 4 in Top 10 Developer Crypto Mistakes以查看實施此過程中的常見錯誤。

不要使用openssl將密碼轉換爲密鑰(或密碼哈希)! openssl中的算法是weak。 Openssl的EVP_BytesToKey()無法滿足低速的要求,這意味着很容易從您的密碼暴力破解密鑰。

這個問題的正確解決方案是使用諸如bcrypt或pbkdf2(Java實現可以毫不費力地找到)的算法來從密碼派生「散列」。然後,通過重新進行與用戶輸入的密碼相同的計算以及爲該密碼存儲的salt,驗證用戶是否正確鍵入了密碼。如果它們匹配,則訪問被授予,否則訪問被拒絕。

請注意,如果此應用程序與服務器交互,通常您會在服務器端進行密碼驗證。如果您的應用不與服務器交互,那麼您可能有充分的理由在設備上進行操作。我不知道你的應用是做什麼的,所以我不能告訴你什麼是對的或對你的。

正確做這件事的很好的參考是How to Safely Store Your Users' Passwords in 2016

+0

嗨greatContini!我更新了所有需要的信息的問題。非常感謝你的幫助。 – paolino

+0

@paolino secretShared與密碼的關係是什麼?我也不清楚aes.Decrypt()的API。它看起來像祕密共享正在解密,但我不清楚使用什麼鍵,也不清楚操作模式。需要更多信息來回答這個問題。 – TheGreatContini

+0

secretShared密碼? :)這是我試圖回答的問題:)。這些都是從客戶端提取的所有細節。非常感謝您的幫助 – paolino