Использование Rijndael initvectors / salt в публичных приложениях - PullRequest
1 голос
/ 04 января 2012

Когда я использую Rijndael (в данном случае RijndaelManaged из .NET в Mono) в общедоступном приложении, которое запрашивает у пользователя только пароль, что будет лучшим способом сделать initvector и соль?Я не могу (возможно) сгенерировать + сохранить их (поскольку документ, сгенерированный приложением, должен быть открыт в других системах только с паролем).

Есть идея как-то сгенерировать их из пароля?Как Sha пароль, а затем генерировать соль и инициатор?

Может кто-нибудь помочь мне с безопасным способом сделать это?

1 Ответ

4 голосов
/ 04 января 2012

Одним из вариантов будет использование Rfc2898DeriveBytes, или PBKDF2 , для создания IV и ключа из пароля.

При одинаковых входных данных - пароле, соли и числе итераций - PBKDF2 будет каждый раз генерировать одну и ту же последовательность байтов, которую затем можно использовать для своего IV и ключа.

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

public void DoSomething(string password)
{
    byte[] iv, key;

    // default iteration count is 1000 if you don't specify in the constructor
    using (var deriveBytes = new Rfc2898DeriveBytes(password, _salt))
    {
        iv = deriveBytes.GetBytes(16);     // get 16 bytes for the iv
        key = deriveBytes.GetBytes(16);    // get another 16 bytes for the key
    }

    // now use iv and key to setup RijndaelManaged to encrypt or decrypt
}

// shared, constant salt - make this as long and unguessable as you like
private static readonly byte[] _salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...