Суть заключается в создании custom FTP Authentication Provider. Для этого нужно наследовать от интерфейса IFtpAuthenticationProvider
, а затем зарегистрировать эту сборку в GAC. После этого сборка должна быть зарегистрирована в настройках FTP IIS.Расшифровка зашифрованного пароля из членства в ASP.NET с использованием RijndaelManaged
Для этого необходимо использовать базу данных, содержащую мою информацию о пользователе в базе данных, из специализированных поставщиков членства и роли, которые мы разработали ранее. Таким образом, это означает, что я должен использовать файл локальной библиотеки app.config
и читать его с помощью ConfigurationManager.OpenMappedExeConfiguration()
. Я прочитал строки подключения оттуда, и я даже могу provide it to Linq-To-Sql classes dynamically. Нет проблем.
Далее я пытаюсь использовать create a class that inherits from SqlMembershipProvider, чтобы использовать его собственную систему для дешифрования пароля для пользователя. Но проблема в том, что она должна читать значения machineKey
из конфигурации. Единственный способ предоставить пользовательскую конфигурацию SqlMembershipProvider - это метод Initialize
(который не предназначен для использования в нашем коде). Но в любом случае я пробовал и терпел неудачу. Я смог предоставить ему настройки пользовательского членства, но не настройки machineKey
.
Итак, я решил пойти радикально. Я сказал: у меня есть decryptionKey
от machineKey
, поэтому я попытаюсь дешифровать пароль вручную.
До сих пор я попытался с помощью RijndaelManaged
:
private string UnEncodePassword(string encodedPassword, string secretKey)
{
string password = encodedPassword;
var keyBytes = new byte[16];
var secretKeyBytes = Encoding.UTF8.GetBytes(secretKey);
Array.Copy(secretKeyBytes, keyBytes, Math.Min(keyBytes.Length, secretKeyBytes.Length));
RijndaelManaged rm = new RijndaelManaged
{
Mode = CipherMode.CBC,
Padding = PaddingMode.PKCS7,
KeySize = 128,
BlockSize = 128,
Key = keyBytes,
IV = keyBytes
};
var encryptedBytes = Convert.FromBase64String(encodedPassword);
password = Encoding.UTF8.GetString(Decrypt(encryptedBytes, rm));
return password;
}
Я вроде знаю, что я буду стрелять пробелы здесь, так как я не уверен, что накануне своего рода дополнения используется и самое главное даже если бы я мог не попасть в правый IV. Лучшее, что я сделал до сих пор, - это получить какой-то неприятный ответ, например: 21l < ( \ t ].
Так что мне нужны указатели. другая точка зрения приветствуется
EDIT:...
Просто, чтобы сделать вещи немного более ясно, что я не пытаюсь взломать пароль или что-нибудь у меня есть пароль и у меня есть decryptionKey т.д. Я просто хочу найти способ шифрования/расшифровки, чтобы я мог сделать проверку пользователя.
Я полностью осознаю, что шифрование/В первую очередь, пароли pting - это не лучший подход, но есть причины, по которым это делается.
У меня есть две мысли: 1. IV никогда не будет одинаковым, это keyBytes. Он может быть постоянным или храниться где-то. Попробуйте все 0xFF или все 0x00. 2. Почему вам нужен дешифрованный пароль пользователя? Я думаю, вам нужен метод аутентификации пароля, предоставленного пользователем в отношении пароля в базе данных. Правильно? – werewindle
И другие мысли. Странно хранить зашифрованный пароль в базе данных. Почти все программное обеспечение хранит только хэши паролей. – werewindle
@werewindle - 2. да, но пароль зашифрован. Мне нужно сначала его расшифровать, чтобы я мог сравнить его. – TheBoyan