Безопасное шифрование для коротких строк в PHP и Java - PullRequest
3 голосов
/ 11 января 2011

это мой первый вопрос здесь:

Я хочу, чтобы скрипт PHP включал зашифрованный идентификатор пользователя на каждой странице. Затем я прочитаю его с помощью JS и отправлю на сервер Java, где я декодирую значение.

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

Зашифрованные идентификаторы могут быть столбцом автоматического увеличения MySQL 1,2,3 ... и я не могу изменить это.

Эти свойства было бы неплохо иметь:

  • Зашифрованные идентификаторы должны быть действительны только в течение дня, в идеале - одноразовое использование / секунду
  • Зашифрованные идентификаторы не должны быть легко подделаны (в идеале даже самими пользователями)

Не стесняйтесь предлагать другие виды решений. Спасибо!

Ответы [ 4 ]

3 голосов
/ 11 января 2011

Использование защищенной хеш-функции для хеширования комбинации идентификатора пользователя и некоторого значения, которое периодически изменяется, может быть хорошей идеей.Например, вы можете выбрать 128-битное случайное число каждый день, а затем установить идентификатор в качестве хэша этого значения, объединенного с идентификатором пользователя.Предполагая, что вы используете хороший хеш, такой как SHA-256, это криптографически безопасно.

1 голос
/ 11 января 2011

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

0 голосов
/ 11 января 2011

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

Лучшим способом было бы шифрование и дешифрование с помощью PHP: вы можете вызывать PHP из кода JavaScript (используя AJAX.)

Так, например:

encrypt.php

<?php 
    $password = "KEYVALUE"; 
    $secret_text = "USERID HERE"
    $encrypted_text = mcrypt_ecb(MCRYPT_DES, $password, $secret_text, MCRYPT_ENCRYPT); 
    echo $encrypted_text;
?>

Тогда у вас есть что-то, называемое decrypt.php, и все, что он делает, это принимает аргумент GET, и ЕДИНСТВЕННЫМ выводом является дешифрованный текст (без HTML-кода или чего-либо еще. Технически вы, вероятно, должны использовать XML для AJAX, но так как только одно значение ...)

decrypt.php

<?php 
    $password = "KEYVALUE"; 
    $decrypted_text = mcrypt_ecb(MCRYPT_DES, $password, $_GET['decrypt'], MCRYPT_DECRYPT); 
    echo $decrypted_text;
?> 

Вы можете проверить это, позвонив по номеру

decrypt.php? Расшифровывать = encrypted_string

.

Отсюда я бы вызвал скрипт "decrypt.php? Decrypt = encrypted_string" из JavaScript, и JavaScript затем может прочитать расшифрованное значение.

Краткое введение в AJAX можно найти здесь: http://www.yourhtmlsource.com/javascript/ajax.html.

0 голосов
/ 11 января 2011

Подумайте об использовании алгоритма, который числа должны пройти, чтобы быть действительными. Банковские карты, IMEI (мобильные телефоны) и некоторые другие крупные используют алгоритм Луна - http://en.wikipedia.org/wiki/Luhn_algorithm

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