Шифрование вызова Unity c # на узел js-сервер - PullRequest
0 голосов
/ 11 мая 2018

У меня есть сервер узлов и и передача имен пользователей и паролей от единицы.вот что у меня так далеко.Я все еще пытаюсь изучить и понять шифрование, и есть так много типов, и я просто запутался.Приведенный ниже код успешно зашифрует и расшифрует строку.Этот код хороший код для использования для чего-то подобного или есть лучшая альтернатива?Какой тип шифрования используется на самом деле?Как бы я расшифровал это на узле JS?Любой дополнительный пример, ссылки или комментарии будут высоко оценены.Спасибо!

public string encrypt(string toEncrypt) {
    CspParameters cspParams = new CspParameters();

    cspParams.KeyContainerName = "ThisIsAKey";  // This is the key used to encrypt and decrypt can be anything.
    var provider = new RSACryptoServiceProvider(cspParams);

    byte[] tempencryptedBytes = provider.Encrypt(System.Text.Encoding.UTF8.GetBytes(toEncrypt), true);
    string encrypted = Convert.ToBase64String(tempencryptedBytes); // convert to base64string for storage
    Debug.Log("encrypted: " + encrypted);
    // Get the value stored in RegString and decrypt it using the key.
    return encrypted;

}

public string decrypt(string toDecrypt) {
    CspParameters cspParams = new CspParameters();

    cspParams.KeyContainerName = "ThisIsAKey";  // This is the key used to encrypt and decrypt can be anything.
    var provider = new RSACryptoServiceProvider(cspParams);
    string decrypted = System.Text.Encoding.UTF7.GetString(provider.Decrypt(Convert.FromBase64String(toDecrypt), true));
    Debug.Log("decrypted: " + decrypted);
    return decrypted;
}

РЕДАКТИРОВАТЬ : код SHA256, который я использовал, добавлен здесь.Это не выводит правильное строковое значение.

    SHA256 sha256 = SHA256Managed.Create();
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes("randy");
    byte[] hash = sha256.ComputeHash(bytes);

    string result = "";
    for (int i = 0; i < hash.Length; i++) {
        result += String.Format("{0:x2}", i);
    }
    Debug.Log("hash: " + result);

    string result2 = Convert.ToBase64String(hash);
    Debug.Log("hash: " + result2);

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Если что-то хорошее для использования, зависит от контекста.

Если вам нужно передать комбинацию имени пользователя и пароля, тогда действительно может использоваться шифрование RSA, предпочтительно в дополнение к безопасности транспорта TLS для соединения.Если вам просто нужно подтвердить имя пользователя или пароль, вам может понадобиться хэш пароля (или PBKDF).Версию .NET PBKDF2 можно найти в этом плохо названном классе .

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


Таким образом, ваш код использует этот конкретный вызов шифрования с использованием логического значения для выбора алгоритма шифрования.Поскольку логическое значение установлено на true, это означает, что используется RSA с OAEP, используя внутреннюю хеш-функцию SHA-1 (которая безопасна для шифрования OAEP, даже если SHA-1 нет).Лучше использовать более новый вызов , где вы можете указать заполнение без логического анти-паттерна.В этом случае вы также можете указать используемую внутреннюю хеш-функцию.

RSA с OAEP указывается в PKCS # 1 v2.2, который в свою очередь указывается в RFC 8017 .Это даже будет указывать порядок байтов, который будет использоваться (RSA работает с числами в конце, которые могут быть закодированы в байтах по-разному).Пока вы используете совместимую библиотеку в любой среде выполнения и знаете, как кодировать / декодировать открытый текст и зашифрованный текст (при использовании текста), вы сможете дешифровать , используя любую среду выполнения, в которой реализуется RSA сOAEP , если у вас есть соответствующий закрытый ключ, конечно.

0 голосов
/ 11 мая 2018

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

В C # хеширование будет выглядеть примерно так:

string toHash = "PasswordToBehashed";
SHA256 sha = new SHA256();

byte[] tempencryptedBytes = sha.ComputeHash(Encoding.UTF8.GetBytes(toHash));

Для справки см. класс SHA256 и пример с использованием MD5 вместо SHA256 .

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