2011-07-23 37 views
2

如果我的任何假設都關閉,請糾正我。你如何保護你不想散列的數據?

當你用sha1散列一些東西時,你不能反轉散列數據來得到原始字符串。因此,如果我有一封電子郵件,我將稍後需要使用它,存儲在數據庫中,我不能在其上使用sha1。

但是,我仍然希望在出現違規情況時提供保護,那麼我該怎麼辦?

我使用的django在settings.py中存儲了secret_key。

我試過使用AES加密,但注意到由於編碼的字符串更長,返回的加密字符串更長,這是有道理的。但是,加密字符串比原始字符串長得多。有沒有一種加密方式,返回的字符串與原始字符串的大小相同?因爲我使用的是django用戶模式,並且電子郵件被限制爲75個,所以如果用戶使用32-75char電子郵件,加密的字符串長度爲128,大於75,因此它不能存儲在列中。

回答

2

三個key concepts of information security是機密性,完整性和可用性。就你而言,像SHA1這樣的加密散列提供了完整性:你可以隨時檢查散列值以查看郵件是否被篡改。在你的情況下,你需要保密性,哈希函數不會提供:你希望電子郵件在數據庫中不可讀取,以防數據庫被泄露。雖然對稱加密算法是答案的一部分,但更大的問題是關於密鑰管理。一旦你有密鑰來加密和解密電子郵件,你將如何存儲它?有多少人可以訪問密鑰?它會保存在與數據庫相同的計算機上嗎? (這很危險。)它會保持在同一個網絡上嗎?你多久換一次鑰匙?如果你失去了鑰匙會發生什麼?很有可能,您的基礎架構將會像使用未加密的電子郵件一樣容易受到數據泄露的威脅,因爲您將是一個加密的電子郵件。安全是困難的,最好集中精力審計數據庫設置 - 這是許多人所做的事情,具有着名的和經過生產測試的解決方案 - 而不是創建複雜的密碼系統。

0

使用任何密碼安全的方法加密它。

0

散列算法是單向加密方法。這意味着您可以加密數據但不能返回。這是它的目的。

你需要一個雙向加密過程,它可以讓你兩種方式。有關更多詳細信息,請參閱this SO question

0

嘗試河豚算法。

BlowfishCipher樣本從this網站。

package com.ack.security.jce; 

import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.swing.JOptionPane; 

/** 
* This program demonstrates how to encrypt/decrypt input 
* using the Blowfish Cipher with the Java Cryptograhpy. 
* 
*/ 
public class BlowfishCipher { 

    public static void main(String[] args) throws Exception { 

    // create a key generator based upon the Blowfish cipher 
    KeyGenerator keygenerator = KeyGenerator.getInstance("Blowfish"); 

    // create a key 
    SecretKey secretkey = keygenerator.generateKey(); 

    // create a cipher based upon Blowfish 
    Cipher cipher = Cipher.getInstance("Blowfish"); 

    // initialise cipher to with secret key 
    cipher.init(Cipher.ENCRYPT_MODE, secretkey); 

    // get the text to encrypt 
    String inputText = JOptionPane.showInputDialog("Input your message: "); 

    // encrypt message 
    byte[] encrypted = cipher.doFinal(inputText.getBytes()); 

    // re-initialise the cipher to be in decrypt mode 
    cipher.init(Cipher.DECRYPT_MODE, secretkey); 

    // decrypt message 
    byte[] decrypted = cipher.doFinal(encrypted); 

    // and display the results 
    JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), 
            "encrypted text: " + new String(encrypted) + "\n" + 
            "decrypted text: " + new String(decrypted)); 

    // end example 
    System.exit(0); 
    } 
} 
1

可能沒有辦法通過加密來保護您的需要。您的解決方案可能是保持您的數據庫和整個系統的安全(密切關注所用軟件的安全郵件列表,安裝安全更新,使用安全密碼,...)。

加密是通過使用還需要再次解密數據(或響應的私鑰)的祕密密碼短語(或公共密鑰)使數據變得不可讀取的過程。因此,您可能需要在系統上存儲您的密碼短語或私鑰,並且數據不會比以前更受保護。

但是你是正確的哈希是不適用的,如果原始數據必須恢復。通常使用散列來掩蓋密碼。

0

你會想要加密數據。它比聽起來更簡單。請繼續閱讀! :)

我建議您使用所謂的對稱算法,其中使用相同的密鑰來加密和解密數據。最流行的是DES算法的最新版本,稱爲3DESTriple DES

如果您使用.NET,然後使用System.Security.Cryptography庫和TripleDESCryptoServiceProvider類。那裏有大量的樣品。當您搜索示例代碼時,請務必使用術語'TripleDESCryptoServiceProvider'以及您正在編程的任何語言/系統(C#,vb,asp.net)。

如果您使用的不是.NET,請查找該語言/框架的內置或附加Triple-DES庫。下面是一些例子:

相關問題