2012-07-24 68 views
1

舊版本的應用程序在其數據庫中存儲了一些明文密碼。我編寫了一個更新的版本,用於在創建新條目時對密碼進行加密,但我無法直接訪問數據庫以手動加密已存在的條目。更新生效後,它會嘗試解密明文密碼並崩潰。蠻力是檢測加密的唯一合理方法嗎?

短做一些激烈的,如刪除所有現有的數據,唯一的辦法我能想到的就是這個(當使用密碼數據稱爲包裝的僞代碼):

# data refers to the password data, either encrypted or plain 
if data length < AES.block_size: 
    # (Shorter than initialization vector, definitely not encrypted.) 
    open database and replace password entry with encrypt(data) 
    login(username, data) 
else: 
    try: # try plaintext first 
     login(username, data) 
    except AuthenticationError: 
     login(username, decrypt(data)) 
    else: #plain text worked, encrypt data for future use. 
     open database and replace password entry with encrypt(data) 

這似乎是一個恥辱保留這些代碼以解決一次運行後會消失的問題。有沒有其他方法可以確保密碼被加密,只解密那些需要密碼的方法?

回答

2

在這種情況下我這樣做的一個,這取決於客戶端和所涉及的系統上:

  • 設置加密密碼的代碼,刪除所有現有的密碼,並讓每個人都輸入新密碼。我更喜歡這個,因爲密碼很簡單,而且隨着時間的推移可能會被看到或分享。
  • 運行一次性腳本來加密系統中的每個密碼。這種方式從來沒有混合過。
  • 具有以加密方法爲前綴的新的加密密碼,例如, 「SHA1」。你冒着一個人擁有與密碼開頭相同的文字的風險,但這不太可能。