如果我的任何假设都没有,请纠正我。
当您使用sha1进行哈希处理时,您无法反转哈希数据以获取原始字符串。
因此,如果我有一封电子邮件,我将需要稍后使用,存储在数据库中,我就不能在其上使用sha1。
但是,我仍然希望在发生违规时保护,所以我该怎么做?
我正在使用django,它在settings.py中存储了一个secret_key。
我尝试使用AES加密,但注意到由于编码的字符串较长,返回的加密字符串较长,这是有道理的。但是,加密字符串比原始字符串长得多。是否存在一种加密类型,其中返回的字符串与原始字符串的大小相同? Cuz我正在使用django用户模型,并且电子邮件限制为75,因此如果用户使用32-75char电子邮件,则加密字符串的长度为128,即> 75,所以它不能存储在列中。
答案 0 :(得分:2)
三个key concepts of information security是机密性,完整性和可用性。在您的情况下,像SHA1这样的加密哈希提供了完整性:您始终可以检查哈希值以查看电子邮件是否已被篡改。在您的情况下,您需要机密性,哈希函数将无法提供:您希望在数据库受到威胁的情况下,数据库中的电子邮件无法读取。虽然对称加密算法是答案的一部分,但更大的问题是密钥管理。一旦你有一个加密和解密电子邮件的密钥,你将如何存储它?有多少人可以访问密钥?它会与数据库保存在同一台计算机上吗? (这很危险。)它会保留在同一个网络上吗?你多久更换一次钥匙?如果丢失钥匙会怎么样?很可能,您的基础架构与使用未加密的电子邮件一样容易受到数据泄露的影响,因为您将是加密的电子邮件。安全性很难,最好将精力集中在审计数据库设置上 - 这是许多人已经做过的事情,拥有众所周知且经过生产测试的解决方案 - 而不是创建复杂的加密系统。
答案 1 :(得分:1)
可能无法通过加密来满足您的需求。您的解决方案可能是保护您的数据库和整个系统的安全(密切关注使用过的软件的安全邮件列表,安装安全更新,使用安全密码......)。
加密是一个使用秘密密码短语(或公钥)使数据无法读取的过程,这也是再次解密数据(或响应私钥)所需的。因此,您可能必须在系统中存储您的秘密密码短语或私钥,并且数据不会受到更多保护。
但是如果必须恢复原始数据,那么你是正确的哈希是不适用的。通常使用散列来掩盖密码。
答案 2 :(得分:0)
使用任何加密安全方法对其进行加密。
答案 3 :(得分:0)
哈希算法是单向加密方法。这意味着您可以加密数据但不能返回数据。这就是它的目的。
您需要一个双向加密过程,它允许您同时执行两种方式。有关详细信息,请参阅this SO question。
答案 4 :(得分:0)
尝试使用blowfish算法。
来自this网站的BlowfishCipher示例。
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);
}
}
答案 5 :(得分:0)
您需要加密数据。它比听起来更简单。继续阅读! :)
我建议您使用所谓的对称算法,其中使用相同的密钥来加密和解密数据。最受欢迎的是最新版本的DES算法,称为3DES
或Triple DES
。
如果您使用的是.NET,请使用System.Security.Cryptography
库和TripleDESCryptoServiceProvider
类。那里有大量的样品。当您搜索示例代码时,请务必使用术语“TripleDESCryptoServiceProvider”以及您正在编程的任何语言/系统(C#,vb,asp.net)。
如果您使用的是.NET之外的其他内容,那么请查找该语言/框架的内置或附加的Triple-DES库。以下是一些例子: