получить Firefox для расшифровки с использованием частной части сертификата клиента - PullRequest
5 голосов
/ 17 января 2010

Я заинтересован в том, чтобы что-то, что я шифровал, используя открытый ключ на сервере LAMPhp, расшифровывал, используя соответствующий закрытый ключ на веб-клиенте (по крайней мере, Firefox, лучше всего, если это стандартный JavaScript)

Обратите внимание, что я хочу не просто иметь зашифрованное соединение с использованием SSL / https. Или даже использовать клиентские сертификаты на основе браузера в качестве метода входа / контроля доступа. Я знаю, как сделать обе эти вещи. То, что я хочу сделать, это больше похоже на электронную почту с ключами gpg. Я хочу создать короткое сообщение, которое я буду зашифровывать с помощью открытого ключа пользователя, который только он сможет расшифровать с помощью своего личного ключа. То, что я ищу, - это не конфиденциальность, которая достигается автоматически с помощью ssl, а возможность разрешать дешифрование сообщений только определенным пользователям. Я знаю, что могу легко сделать это с помощью gpg или, возможно, SMIME, и, возможно, это лучший способ, но я бы предпочел альтернативу через Интернет.

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

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

Так что на стороне php я бы использовал вызовы шифрования openssl, вот так ...

<?php

$browsers_public_key = get_it_from_the_browser_via_apache_maybe(); 

openssl_public_encrypt($data,$encrypted_ends_up_here,$browsers_public_key);

echo "<html><head>
<script type='javascript'>
      function decrypt_textarea(){  
            ??
     }
</script>
</head>
<body><textarea id='decrypt_me'> $encrypted_ends_up_here </textarea> 
<div id='where_the_plaintext_goes'>  </div>
</body> </html>";

?>

Обратите внимание, что я обнаружил с помощью stackedoverflow много прекрасных библиотек шифрования javascript ... но я действительно хочу использовать ключи, импортированные в Firefox в соответствии с MyOpenId.com или CaCert.org

Кто-нибудь знает, возможно ли это?

Спасибо, -Ft

Ответы [ 4 ]

3 голосов
/ 31 августа 2010

Прошло много времени с тех пор, как вы задавали этот вопрос, но если вы или кто-то еще ищете потенциальное решение этой или подобной проблемы, им следует проверить проект JavaScript Forge:

http://github.com/digitalbazaar/forge/blob/master/README

Этот проект имеет реализацию SSL в JavaScript, которая позволит вам включать клиентский сертификат при взаимодействии с Apache. Вы также можете выполнить расшифровку RSA вручную, используя соответствующий закрытый ключ (к которому у вас есть доступ в JavaScript).

Например, JavaScript может получить / отправить на сервер и включить его сертификат на стороне клиента. Apache может прочитать этот сертификат, использовать открытый ключ для шифрования любых подходящих данных и затем вернуть эти данные клиенту. Затем клиент может использовать свой закрытый ключ (в JavaScript), расшифровать информацию и что-то с ней сделать. Это дополнительное шифрование, вероятно, даже не требуется, если ваш сервер может подтвердить подлинность сертификата на стороне клиента как соответствующего получателя секрета, который вы пытаетесь передать.

Проект Forge также имеет API-интерфейсы для построения системы для импорта / экспорта ключей и сертификатов в / из Firefox или других браузеров (если по какой-то причине это все еще требуется). Может понадобиться небольшая помощь от openssl, чтобы получить ключи / сертификаты в правильном формате для импорта / экспорта (pem => pkcs12), но пример того, как это работает, можно найти в демонстрации WebID на основе JavaScript. WebID - это система аутентификации на основе сертификатов на стороне клиента:

Демонстрация управления WebID: https://webid.digitalbazaar.com/manage/

Демонстрация аутентификации WebID: https://payswarm.com/webid-demo/

Обратите внимание, что сертификаты SSL для вышеперечисленных сайтов являются самозаверяющими и для их просмотра потребуется добавить временные исключения в браузер. Сайты не требуют ввода каких-либо личных данных, они только для демонстрационных целей. Однако, если вы перейдете по первой ссылке, вы можете сгенерировать ключи в браузере (для этого он использует Forge JavaScript), а затем вы сможете увидеть сгенерированный закрытый ключ и сертификат в формате PEM в списке вверху. страницы. Ключ и сертификат сохраняются через локальное хранилище Flash.

Почти 100% (если не это) источника для сайта управления WebID доступны для просмотра, поскольку в основном это JavaScript. Кроме того, сам проект Forge (см. Ссылку на github) является открытым исходным кодом.

2 голосов
/ 19 января 2010

Теперь, когда я понимаю, что вы говорите, я могу дать вам твердый ответ:)

Лучшее, что я могу вам сказать, это то, что вы не можете получить достойное шифрование так, как выглядитесделать это.Шифрование с закрытым ключом (а именно RSA) использует очень, очень, очень большие числа для шифрования.Использование небольших чисел очень просто взломать в вычислительном отношении (таких простых чисел очень много), и числа становятся необычайно быстрыми.По сути, с RSA вам нужно брать большие числа и поднимать их до больших показателей.JavaScript может поддерживать довольно большие числа, но вы столкнетесь с быстродействием.При использовании 512-битного ключа шифрование в несколько килобайт может занять до нескольких секунд, а расшифровка может занять от нескольких секунд до минут.Причина, по которой JS такой медленный, заключается просто в том, что это не скомпилированный язык.Конечно, вы можете уменьшить размер ключа, но что-нибудь большее, чем пара килобайт, и у вас возникнут проблемы.

Кроме того, RSA по своей природе небезопасен на веб-странице, поскольку закрытый ключ передается вместе с данными вбыть дешифрован (если он не был передан ранее), что позволяет любому, кто получает страницу, дешифровать данные.

Я собираюсь предположить, что вы хотите сделать это, потому что вы хотите запутать некоторый код изваш пользователь или клиент, поэтому я рекомендую вам проверить шифрование XOR.Конечно, он далеко не так безопасен, как RSA, но использует принципы, которые могут быть очень безопасными при правильном использовании.Например, если вы используете случайный ключ, который используется только один раз и имеет ту же длину, что и ваши данные / код (одноразовый блокнот), ваше шифрование «не взломается».Более того, шифрование XOR БЫСТРО.Вот некоторые ресурсы:

http://guymal.com/mycode/xor_js_encryption/

http://javascript.internet.com/passwords/xor-encryption4.html

Надеюсь, вам повезло с тем, что вы пытаетесь сделать!

1 голос
/ 10 марта 2010

Я ищу в точности то же, что и вы, и тоже хотел использовать php-функции openssl. Я был рад видеть, что на phpside все отлично работает с закрытым / открытым ключом (encrypt / decrypt) и теперь хотел найти способ использовать privatekey на клиентской стороне, как вы.

!!!

Если вы найдете что-нибудь, пожалуйста, дайте мне знать по электронной почте:

pki (at) life.de

!!!

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

Но это похоже на тупик с Firefox, но с IE и ActiveX это возможно с CAPICOM (я не очень много читал об этом сейчас). hxxp: //geekswithblogs.net/shahed/archive/2007/05/03/112232.aspx

Но для JavaScript / PHP посмотрите (и прочитайте все комментарии в FAQ и на других страницах! В будущем, возможно, упоминалось двунаправленное общение): hxxp: //www.jcryption.org/

hxxp: //www.zend.com//code/codex.php ozid = 1323 & одиночный = 1

Чистый Javascript Public / Privatekey шифрование hxxp: //shop-js.sourceforge.net/crypto2.htm

Надежный FireFox-аддон для PKI: hxxps: //addons.mozilla.org/en-US/firefox/addon/4471 hxxp: //www.mozilla.org/projects/security/pki/nss/tools/index.html

PHP с OpenSSL на стороне сервера / .NET на стороне клиента hxxp: //www.csharpbydesign.com/2008/04/asymmetric-key-encryption-with.html

Javascript OpenPGP

hxxp: //www.hanewin.net/encrypt/

PS: тупой механизм мешает мне публиковать ссылки ...

0 голосов
/ 17 января 2010

Вы не обрабатываете SSL в своем PHP. SSL обрабатывается веб-сервером автоматически. Если вы используете Apache, вот простое руководство:

http://www.debian -administration.org / статьи / Setting_up_an_SSL_server_with_Apache2

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

Надеюсь, это поможет!

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