Как вы защищаете данные, которые не хотите хэшировать? - PullRequest
2 голосов
/ 24 июля 2011

Поправьте меня, если какие-то из моих предположений не верны.

Когда вы хэшируете что-то вроде sha1, вы не можете перевернуть хешированные данные, чтобы получить исходную строку.

Из-за этого, если у меня есть электронное письмо, которое мне нужно будет использовать позже, хранящееся в базе данных, я не могу использовать на нем sha1.

Однако я все равно хочу защитить в случае взлома, так чтоделать?

Я использую django, который хранит секретный ключ в settings.py.

Я пытался использовать шифрование AES, но заметил, что, поскольку закодированная строка длиннее, зашифрованная строка возвращаетсядлиннее, что имеет смысл.Однако строка шифрования намного длиннее исходной строки.Существует ли тип шифрования, в котором возвращаемая строка совпадает с исходной строкой?Потому что я использую модель пользователя django, и размер электронной почты ограничен 75, поэтому, если пользователь использовал электронную почту размером 32-75 символов, длина зашифрованной строки составляет 128, что> 75, поэтому ее нельзя сохранить в столбце.

Ответы [ 6 ]

2 голосов
/ 24 июля 2011

Три ключевых понятия информационной безопасности - это конфиденциальность, целостность и доступность. В вашем случае криптографический хеш, такой как SHA1, обеспечивает целостность: вы всегда можете проверить по значению хеша, чтобы убедиться, что электронное письмо не было подделано. В вашем случае вам нужна конфиденциальность, которую не обеспечит хеш-функция: вы хотите, чтобы электронные письма были нечитаемыми в базе данных в случае взлома базы данных. Хотя алгоритм симметричного шифрования является частью ответа, более важный вопрос касается управления ключами. Как только вы получите ключ для шифрования и расшифровки писем, как вы будете его хранить? Сколько людей будет иметь доступ к ключу? Будет ли он храниться на том же компьютере, что и база данных? (Это опасно.) Будет ли оно храниться в той же сети? Как часто вы будете менять ключи? Что произойдет, если вы потеряете ключ? По всей вероятности, ваша инфраструктура будет так же уязвима для взлома данных с незашифрованными электронными письмами, как и зашифрованные. Безопасность сложна, и лучше сосредоточить свои усилия на аудите настроек вашей базы данных - что многие люди уже сделали, имеют хорошо известные и проверенные на практике решения, а не на создании сложной криптографической системы.

1 голос
/ 24 июля 2011

Вероятно, не существует способа защиты с помощью шифрования, соответствующего вашим потребностям.Ваше решение может заключаться в обеспечении безопасности вашей базы данных и всей системы (следите за списками рассылки использованного программного обеспечения, устанавливайте обновления безопасности, используйте безопасные пароли, ...).

Шифрование - это процесс, в которомданные становятся нечитаемыми с помощью секретной парольной фразы (или открытого ключа), которая необходима также для повторного дешифрования данных (или отвечающего секретного ключа).Так что, вероятно, вам придется хранить тогда вашу секретную фразу-пароль или закрытый ключ в вашей системе, и данные не защищены больше, чем раньше.

Но вы правы, что хеширование неприменимо, если исходные данныебыть восстановленным.Обычно хэширование используется для маскировки паролей.

0 голосов
/ 24 июля 2011

Вы хотите зашифровать данные. Это намного проще, чем кажется. Читать дальше! :)

Я рекомендую вам использовать так называемый симметричный алгоритм, в котором один и тот же секретный ключ используется для шифрования и дешифрования данных. Наиболее популярной является последняя версия алгоритма DES, которая называется 3DES или Triple DES.

Если вы используете .NET, то используйте библиотеку System.Security.Cryptography и класс TripleDESCryptoServiceProvider. Там есть тонны образцов. При поиске примера кода обязательно используйте термин «TripleDESCryptoServiceProvider» и любой язык / систему, на которой вы программируете (C #, vb, asp.net).

Если вы используете что-то отличное от .NET, то поищите встроенную или дополнительную библиотеку Triple-DES этого языка / фреймворка. Вот несколько примеров:

0 голосов
/ 24 июля 2011

Попробуйте алгоритм Blowfish.

Образец 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);
  }
}
0 голосов
/ 24 июля 2011

Алгоритмы хеширования являются односторонними методами шифрования. Это означает, что вы можете зашифровать данные, но не вернуть их. Это его цель.

Вам необходим двухсторонний процесс шифрования, который позволяет вам выполнять оба пути. См. этот SO вопрос для более подробной информации.

0 голосов
/ 24 июля 2011

Зашифруйте его любым криптографически безопасным методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...