Существует ли версия или модификация RC4, которая будет производить зашифрованные строки, которые безопасны для использования в качестве значений cookie - PullRequest
1 голос
/ 29 июня 2019

Мне нужно скрыть конфиденциальную информацию, такую ​​как адреса электронной почты, написанные для файлов cookie посетителя на моем веб-сайте, и я надеялся на RC4. Но я написал простой тест для сравнения каждого символа в строках, выводимых из стандартной процедуры RC4, со всеми известными допустимыми символами для использования в файлах cookie, основываясь на документации, которую я извлек из https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie После нескольких случайных тестов я пришел к выводу, что Строки RC4 могут вызывать проблемы, если они записаны в значения cookie «как есть».

Конечно, я мог бы использовать что-то более простое, например base64, поскольку файлы cookie будут храниться в собственной системе посетителя. Но я бы лучше использовал что-то более сильное. Я был бы осторожен или переписывал подпрограмму RC4, чтобы «придерживаться» разрешенных символов, и знал бы, что могу восстановить исходные данные. Но прежде чем я попробую, я хотел бы подумать, что это уже «сделано». Но я не смог найти такую ​​вещь.

Для справки: это процедура RC4, с которой я бы начал (PHP) ...

/*
 * RC4 symmetric cipher encryption/decryption
 *
 * @license Public Domain
 * @param string key - secret key for encryption/decryption
 * @param string str - string to be encrypted/decrypted
 * @return string
 */
function rc4($key, $str) {
    $s = array();
    for ($i = 0; $i < 256; $i++) {
        $s[$i] = $i;
    }
    $j = 0;
    for ($i = 0; $i < 256; $i++) {
        $j = ($j + $s[$i] + ord($key[$i % strlen($key)])) % 256;
        $x = $s[$i];
        $s[$i] = $s[$j];
        $s[$j] = $x;
    }
    $i = 0;
    $j = 0;
    $res = '';
    for ($y = 0; $y < strlen($str); $y++) {
        $i = ($i + 1) % 256;
        $j = ($j + $s[$i]) % 256;
        $x = $s[$i];
        $s[$i] = $s[$j];
        $s[$j] = $x;
        $res .= $str[$y] ^ chr($s[($s[$i] + $s[$j]) % 256]);
    }
    return $res;
}

Также для справки, на основе ссылки на mozilla.org, которую я связал, я построил эту простую функцию javascript для проверки выходных строк и подсчета ошибок (ошибки означают недопустимые символы) в строке.

function cookieSafe(str) {
    var okchars = "!#$%&'()*+-./:<=>?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
    var letterNumber = /^[0-9a-zA-Z]+$/;
    var s;
    var errors =0;

    for (var i = 0; i < str.length; i++) {
        s = str.substr(i,1);
        if (okchars.indexOf(s) > -1) continue;
        errors +=1;
        }
    return errors;
    }

Спасибо за любую помощь, и спасибо, что НЕ проголосовали. Лучше бы мне посоветовали правильно исправить или удалить мой вопрос, чем снова «забанить».

...