Эквивалент Rfc2898DeriveBytes в javascript?

Я видел код C#, который может шифровать, а затем расшифровывать пароль, используя такой код:

http://wp7-travel.googlecode.com/svn/trunk/SilverlightPhoneDatabase/Cryptography.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Reflection;

namespace SilverlightPhoneDatabase
{
    /// <summary>
    /// Class used to encrypt the database
    /// </summary>
    public static class Cryptography
    {

        /// <summary>
        /// Incrypt the input using password provided
        /// </summary>
        /// <param name="input">Input string to encrypt</param>
        /// <param name="password">Password to use</param>
        /// <returns>Encrypted string</returns>
        public static string Encrypt(string input, string password)
        {

            string data = input;
            byte[] utfdata = UTF8Encoding.UTF8.GetBytes(data);
            byte[] saltBytes = UTF8Encoding.UTF8.GetBytes(password);



            // Our symmetric encryption algorithm
            AesManaged aes = new AesManaged();

            // We're using the PBKDF2 standard for password-based key generation
            Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(password, saltBytes);

            // Setting our parameters
            aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
            aes.KeySize = aes.LegalKeySizes[0].MaxSize;
            aes.Key = rfc.GetBytes(aes.KeySize / 8);
            aes.IV = rfc.GetBytes(aes.BlockSize / 8);

            // Encryption
            ICryptoTransform encryptTransf = aes.CreateEncryptor();

            // Output stream, can be also a FileStream
            MemoryStream encryptStream = new MemoryStream();
            CryptoStream encryptor = new CryptoStream(encryptStream, encryptTransf, CryptoStreamMode.Write);

            encryptor.Write(utfdata, 0, utfdata.Length);
            encryptor.Flush();
            encryptor.Close();

            byte[] encryptBytes = encryptStream.ToArray();
            string encryptedString = Convert.ToBase64String(encryptBytes);

            return encryptedString;
        }

        /// <summary>
        /// Decrypt string using password provided
        /// </summary>
        /// <param name="base64Input">Input to decrypt</param>
        /// <param name="password">Password to use</param>
        /// <returns>Decrypted string</returns>
        public static string Decrypt(string base64Input, string password)
        {

            byte[] encryptBytes = Convert.FromBase64String(base64Input);
            byte[] saltBytes = Encoding.UTF8.GetBytes(password);

            // Our symmetric encryption algorithm
            AesManaged aes = new AesManaged();

            // We're using the PBKDF2 standard for password-based key generation
            Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(password, saltBytes);

            // Setting our parameters
            aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
            aes.KeySize = aes.LegalKeySizes[0].MaxSize;
            aes.Key = rfc.GetBytes(aes.KeySize / 8);
            aes.IV = rfc.GetBytes(aes.BlockSize / 8);

            // Now, decryption
            ICryptoTransform decryptTrans = aes.CreateDecryptor();

            // Output stream, can be also a FileStream
            MemoryStream decryptStream = new MemoryStream();
            CryptoStream decryptor = new CryptoStream(decryptStream, decryptTrans, CryptoStreamMode.Write);

            decryptor.Write(encryptBytes, 0, encryptBytes.Length);
            decryptor.Flush();
            decryptor.Close();

            byte[] decryptBytes = decryptStream.ToArray();
            string decryptedString = UTF8Encoding.UTF8.GetString(decryptBytes, 0, decryptBytes.Length);
            return decryptedString;
        }
    }
}

Я не эксперт по безопасности и имею ограниченный опыт работы с криптоалгоритмами. У меня есть зашифрованный пароль, который был зашифрован таким кодом, и теперь я хочу получить доступ к расшифрованному паролю в программе node.js (Javascript).

Кажется, у crypto-js есть модуль pbkdf2.js, но он умеет только шифровать пароль.

Я видел http://anandam.name/pbkdf2/, но опять же похоже, что это только шифровальщик. Без расшифровки.

Может ли кто-нибудь предоставить код, который будет расшифровывать пароль, учитывая известную соль и итерации, которые использовались для его шифрования, используя простой Javascript, предпочтительно используя общие модули, такие как crypto-js?


person Neek    schedule 20.12.2013    source источник


Ответы (1)


PBKDF — это функция получения ключа на основе пароля. PBKDF не являются алгоритмами шифрования. Их можно сравнить с односторонними безопасными алгоритмами хэширования с солью (чтобы сделать вывод для идентичных паролей уникальным) и счетчиком итераций (чтобы сделать их медленными). Многие PBKDF, такие как PBKDF2 в вашем вопросе, фактически реализованы с использованием хеш-алгоритмов, таких как SHA-1.

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

person Maarten Bodewes    schedule 20.12.2013