Результаты поиска
Шифрование Паролей
Каков самый быстрый, но безопасный способ шифрования паролей в (предпочтительно PHP), и для какого метода вы выбираете, является ли он портативным?
Другими словами, если я позже перенесу свой сайт на другой сервер, будут ли мои пароли продолжать работать?
Метод, который я использую сейчас, как мне было сказано, зависит от точных версий библиотек, установленных на сервере.
Почему плохой пароль вызывает "заполнение недопустимо и не может быть удалено"?
Мне нужно было какое-то простое строковое шифрование, поэтому я написал следующий код (с большим количеством "inspiration" отсюда ):
// create and initialize a crypto algorithm
private static SymmetricAlgorithm getAlgorithm(string password) {
SymmetricAlgorithm algorithm = Rijndael.Create();
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(
password, new byte[] {
0x53,0x6f,0x64,0x69,0x75,0x6d,0x20, // salty goodness
0x43,0x68,0x6c,0x6f,0x72,0x69,0x64,0x65
}
);
algorithm.Padding = PaddingMode.ISO10126;
algorithm.Key = rdb.GetBytes(32);
algorithm.IV = rdb.GetBytes(16);
return algorithm;
}
/*
* encryptString
* provides simple encryption of a string, with a given password
*/
public static string encryptString(string clearText, string password) {
SymmetricAlgorithm algorithm = getAlgorithm(password);
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, algorithm.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
/*
* decryptString
* provides simple decryption of a string, with a given password
*/
public static string decryptString(string cipherText, string password) {
SymmetricAlgorithm algorithm = getAlgorithm(password);
byte[] cipherBytes = Convert.FromBase64String(cipherText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, algorithm.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
return System.Text.Encoding.Unicode.GetString(ms.ToArray());
}
Код, похоже, работает нормально, за исключением того, что при расшифровке данных с неверным ключом я получаю CryptographicException - "Padding is invalid and cannot be removed" - на строке cs.Close() в decryptString.
пример кода:
string password1 = "password";
string password2 = "letmein";
string startClearText = "The quick brown fox jumps over the lazy dog";
string cipherText = encryptString(startClearText, password1);
string endClearText = decryptString(cipherText, password2); // exception thrown
Мой вопрос в том, можно ли этого ожидать? Я бы подумал, что расшифровка с неверным паролем просто приведет к бессмысленному выходу, а не к исключению.
Может ли прокси-сервер кэшировать SSL GETs? Если нет, то будет ли достаточно шифрования тела ответа?
Может ли (||любой) прокси-сервер кэшировать содержимое, запрошенное клиентом через https? Поскольку прокси-сервер не может видеть строку запроса или заголовки http, я думаю, что они не могут.
Я рассматриваю настольное приложение, управляемое рядом людей, стоящих за своими компаниями прокси. Это приложение может получить доступ к услугам через интернет, и я хотел бы воспользоваться встроенной инфраструктурой кэширования интернета для 'reads'. Если кэширующие прокси-серверы не могут кэшировать доставленное содержимое SSL, будет ли просто шифрование содержимого ответа жизнеспособным вариантом?
Я рассматриваю все запросы GET, которые мы хотим получить, будут запрошены через http с телом, зашифрованным с помощью асимметричного шифрования, где у каждого клиента есть ключ расшифровки. Всякий раз, когда мы хотим выполнить операцию GET, которая не является cachable, или операцию POST, она будет выполнена над SSL.
Подходящая альтернатива CryptEncrypt
У нас есть ситуация в нашем продукте, где в течение длительного времени некоторые данные хранились в базе данных приложения в виде строки SQL (выбор сервера MS SQL или sybase SQL в любом месте), которая была зашифрована с помощью функции Windows API CryptEncrypt. (прямой и де-криптографический)
Проблема в том, что CryptEncrypt может производить NULL в выходных данных, что означает, что когда он хранится в базе данных, строковые манипуляции в какой-то момент усекут CipherText.
В идеале мы хотели бы использовать algo, который будет производить CipherText, который не содержит NULLs, поскольку это вызовет наименьшее количество изменений в существующих базах данных (изменение столбца со строки на двоичный и код для работы с двоичным вместо строк) и просто расшифрует существующие данные и повторно зашифрует с помощью нового алгоритма во время обновления базы данных.
Алгоритм не должен быть самым безопасным, так как база данных уже находится в достаточно безопасной среде (а не в открытой сети / межсистемных сетях), но должен быть лучше, чем ROT13 (который я могу почти расшифровать в своей голове сейчас!)
edit: кстати, есть ли конкретная причина для изменения шифротекста на шифротекст? шифротекст кажется более широко используемым...
Шифрование в веб-сервисах C#
Я ищу простой способ зашифровать мое сообщение soap в моем веб-сервисе C#.
Я искал WSE 3.0 , но, похоже, Microsoft отказалась от его поддержки, и поэтому его не так просто использовать.
Похоже, что WCF мог бы быть вариантом, но я предпочитаю не обновляться с .NET 2.0 .
Какой-нибудь простой и понятный метод шифрования?
Как я могу использовать шифрование/расшифровку 3DES в Java?
Каждый метод, который я пишу для кодирования строки в Java с использованием 3DES, не может быть расшифрован обратно в исходную строку. Есть ли у кого-нибудь простой фрагмент кода, который может просто кодировать, а затем декодировать строку обратно в исходную строку?
Я знаю, что совершаю очень глупую ошибку где-то в этом коде. Вот с чем я работал до сих пор:
** обратите внимание, что я не возвращаю текст BASE64 из метода encrypt, и я не снимаю кодировку base64 в методе decrypt, потому что я пытался увидеть, не ошибся ли я в части BASE64 головоломки.
public class TripleDESTest {
public static void main(String[] args) {
String text = "kyle boon";
byte[] codedtext = new TripleDESTest().encrypt(text);
String decodedtext = new TripleDESTest().decrypt(codedtext);
System.out.println(codedtext);
System.out.println(decodedtext);
}
public byte[] encrypt(String message) {
try {
final MessageDigest md = MessageDigest.getInstance("md5");
final byte[] digestOfPassword = md.digest("HG58YZ3CR9".getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;)
{
keyBytes[k++] = keyBytes[j++];
}
final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
final byte[] plainTextBytes = message.getBytes("utf-8");
final byte[] cipherText = cipher.doFinal(plainTextBytes);
final String encodedCipherText = new sun.misc.BASE64Encoder().encode(cipherText);
return cipherText;
}
catch (java.security.InvalidAlgorithmParameterException e) { System.out.println("Invalid Algorithm"); }
catch (javax.crypto.NoSuchPaddingException e) { System.out.println("No Such Padding"); }
catch (java.security.NoSuchAlgorithmException e) { System.out.println("No Such Algorithm"); }
catch (java.security.InvalidKeyException e) { System.out.println("Invalid Key"); }
catch (BadPaddingException e) { System.out.println("Invalid Key");}
catch (IllegalBlockSizeException e) { System.out.println("Invalid Key");}
catch (UnsupportedEncodingException e) { System.out.println("Invalid Key");}
return null;
}
public String decrypt(byte[] message) {
try
{
final MessageDigest md = MessageDigest.getInstance("md5");
final byte[] digestOfPassword = md.digest("HG58YZ3CR9".getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;)
{
keyBytes[k++] = keyBytes[j++];
}
final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
decipher.init(Cipher.DECRYPT_MODE, key, iv);
//final byte[] encData = new sun.misc.BASE64Decoder().decodeBuffer(message);
final byte[] plainText = decipher.doFinal(message);
return plainText.toString();
}
catch (java.security.InvalidAlgorithmParameterException e) { System.out.println("Invalid Algorithm"); }
catch (javax.crypto.NoSuchPaddingException e) { System.out.println("No Such Padding"); }
catch (java.security.NoSuchAlgorithmException e) { System.out.println("No Such Algorithm"); }
catch (java.security.InvalidKeyException e) { System.out.println("Invalid Key"); }
catch (BadPaddingException e) { System.out.println("Invalid Key");}
catch (IllegalBlockSizeException e) { System.out.println("Invalid Key");}
catch (UnsupportedEncodingException e) { System.out.println("Invalid Key");}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Программное шифрование конфигурационного файла внутри .NET
Не мог бы кто-нибудь сделать краткое описание того, как программно зашифровать конфигурационный файл в .NET, предпочтительно в C#.
Я бы хотел сделать что-то вроде проверки запуска приложения, чтобы увидеть, является ли раздел незащищенным, и если да, то зашифровать его. Это касается как настроек, так и строк подключения.
Также если бы кто-нибудь мог перечислить типы шифровальщиков и в чем разница между ними.
Я не знаю, является ли код для выполнения этого в обычном WinForms-приложении прозрачным для выполнения этого в ASP.NET.
Алгоритм за MD5Crypt
Я работаю с Subversion на основе Windows и хотел бы написать простую утилиту в .NET для работы с файлом пароля Apache. Я понимаю, что он использует функцию, называемую MD5Crypt, но я не могу найти описание алгоритма, кроме того, что в какой-то момент он использует MD5 для создания hash.
Может ли кто-нибудь описать алгоритм MD5Crypt и формат строки пароля?
Почему в поле ввода больше, чем его выход?
Я не понимаю, откуда берутся дополнительные биты в этой статье о s-boxes. Почему s-box не принимает такое же количество битов для ввода, как и для вывода?
Безопасные онлайн-списки рекордов для не-веб-игр
Я играю с родной (не веб -) однопользовательской игрой, которую я пишу, и мне пришло в голову, что наличие списка рекордов daily/weekly/all-time онлайн (думаю, что Xbox Live Leaderboard) сделает игру намного интереснее, добавив некоторое (небольшое) количество сообщества и конкуренции. Однако я боюсь, что люди увидят такую функцию, как приглашение к взлому, что будет препятствовать обычным игрокам из-за невероятно высоких баллов.
Я думал об очевидных способах предотвращения таких попыток (public/private key encryption, например), но я выяснил достаточно простые способы, которыми хакеры могли бы обойти все мои идеи (извлечение открытого ключа из двоичного файла и, таким образом, отправка поддельных зашифрованных результатов, например).
Вы когда-нибудь реализовывали онлайн-список рекордов или таблицу лидеров? Нашли ли вы разумно защищенный от хакеров способ реализации этого? Если да, то как вы это сделали? Каковы ваши впечатления от попыток взлома?