Реализация на javascript
(1 чел.) (1) гость
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

ТЕМА: Реализация на javascript

Re: Реализация на javascript 2 года, 2 мес. назад #3121

  • vprokof
  • Осваиваюсь на форуме
  • Постов: 28
  • Репутация: 0
Тогда нужно двигаться в направлении блокчейн,
Например:
steemit.com/authentication/@mamont/bespa...iya-cherez-blokchein

Решение заключается в том, чтобы выпустить SSL-сертификат с адресом электронной почты и номером телефона пользователя, при этом хеш (контрольную сумму) сертификата записать в блокчейн.

1) Когда пользователь из браузера с сертификатом идёт на сайт, последний требует у браузера предъявить сертификат клиента.
2) Сервер, получив сертификат, вначале проверяет его подпись.
3) Сервер генерирует случайное число, шифрует его на публичном ключе, находящемся в предъявленном сертификате, и отправляет вашему браузеру. Это - одноразовый пароль соединения.
4) Браузер, имея файл с сертификатом и ключом, извлекает из него секретный ключ и расшифровывает пароль, посланный сервером. После этого браузер устанавливает безопасное https-соединение с сервером.
5) Сервер, убедившись в том, что клиент владеет корректным секретным ключом, производит проверку информации сертификата через блокчейн. Для этого он извлекает из сертификата серийный номер, и выполняет поиск по этому серийному номеру. После этого сервер вычисляет контрольную сумму только что полученного сертификата и убеждается в том, что предъявленный сертификат с соответствующим серийным номером – то же самый, который участвовал в регистрации.

Перечень 21 компаний, использующие блокчейн для управления идентификацией и аутентификации
geektimes.ru/company/wirex/blog/284548/and-authentication/
Изменено: 2 года, 2 мес. назад от vprokof.

Re: Реализация на javascript 2 года, 2 мес. назад #3122

  • ugotbug
  • Завсегдатай
  • Постов: 225
  • Репутация: 14
Добрый день.

Мне показалось, вы в упрощенной форме пересказали фазы установки соединения протокола TLS. Только, как я понял, предлагаете выполнять проверку статуса сертификата (или факт выпуска?) посредством сети блокчейн. Чем это отличается от проверки по CRL? Не достаточно ли этого?
Блокчейн очень интересная технология, мы ее немного изучали, но есть ряд открытых вопросов, мешающих ее активному применению.
Думаю, вы согласитесь, что технология должна быть "обкатанной", не достаточно, чтобы она была просто в мейнстриме. Нужно следить за ней и успеть поймать волну массового применения в областях связанных с PKI. Иначе есть риск прогореть, выбросив на ветер ресурсы, а мы такого себе позволить не можем. Второе, это вопрос майнинга. НУЦ не высокотехнологичная компания с громадным бюджетом и ресурсами, все, что мы делаем - это обеспечиваем граждан РК средствами подписи. Содержать пулы серверов для майнинга (а он должен быть достаточно производительным и отказоустойчивым!) задача непростая, как с финансовой, так и с технической точки зрения. Куда проще предоставлять списки отзыва, а клиент сам определит статус сертификата.
В целом, за блокчейн надо следить и если действительно появится грамотное и надежное решение, то конечно будем обсуждать ее применение.

p.s. Умные контракты, вот где реальный потенциал. Уверен, за ними будущее.
Могущественный обладатель кольца Знаний
Изменено: 2 года, 2 мес. назад от ugotbug.

Re: Реализация на javascript 2 года, 2 мес. назад #3123

  • vprokof
  • Осваиваюсь на форуме
  • Постов: 28
  • Репутация: 0
Правила проверки подлинности электронной цифровой подписи
adilet.zan.kz/rus/docs/V1500012864#z7
На мой взгляд, всё это можно реализовать на JavaScript посредством вышеуказанных библиотек.

Сейчас все предложения использовать JavaScript
разбиваются доводами
- подходы не универсальные.
- Нельзя работать с внешними хранилищами

Обсуждение блокчейн на ПМЭФ 2017
БЛОКЧЕЙН — РОЖДЕНИЕ НОВОЙ ЭКОНОМИКИ, ПМЭФ 2017
Смотреть на youtube в середине

100 % Российских банков собираются внедрять блокчейн.
Президент России до 2-х часов ночи обсуждал на ПМЭФ 2017 внедрение блокчейна.
Думаю, что у нас ситуация аналогичная.
Изменено: 2 года, 2 мес. назад от vprokof.

Re: Реализация на javascript 2 года, 2 мес. назад #3125

  • ugotbug
  • Завсегдатай
  • Постов: 225
  • Репутация: 14
Действительно, в области экономики, нотариата, медицины и банковской сферы блокчейн может быть полезным.
Каким образом его использовать в PKI, криптографии не могу пока представить.
Как вариант его можно использовать, например для реализации протокола ААА
Могущественный обладатель кольца Знаний

Re: Реализация на javascript 2 года, 2 мес. назад #3233

  • vprokof
  • Осваиваюсь на форуме
  • Постов: 28
  • Репутация: 0
Контрольный пример на JavaScript. Работа с публичным ключом
- Идём на nodejs.org/en/
- устанавливаем Latest LTS Version: v6.11.0 (includes npm 3.10.10)
- Идём на github.com/digitalbazaar/forge
- скачиваем github.com/digitalbazaar/forge/archive/master.zip
- Чтобы читать x509 subject не только в латинице
читаем Please add support for UTF8 in x509 subject
github.com/digitalbazaar/forge/issues/397
github.com/Cojad/forge/commit/0f6d5d3c71...ac1bae3f29374369f743

Правим файл js/x509.js

obj.type = asn1.derToOid(attr.value[0].value);
obj.value = attr.value[1].value;
obj.valueTagClass = attr.value[1].type;
+ if(obj.valueTagClass == asn1.Type.UTF8) {
+ obj.value = forge.util.decodeUtf8(obj.value);
+ }
// if the OID is known, get its name and short name
if(obj.type in oids) {
obj.name = oids[obj.type];


- запускаем npm install
- запускаем npm run build
- получаем dist/forge.min.js

- Проверяем теперь вариант для браузера

index.html
<!DOCTYPE HTML>
<html>
<head>
    <title>Reading Binary Data with the File API and JavaScript</title>

    <script src="jquery.js"></script>
    <script src="forge.min.js"></script>
    <script src="ecp.js"></script>
    <script>
        $(document).ready(function() {
           var ecp = new ecpReader('browseOpen', function(keyBinnary) {
               ecp.getkeyData(keyBinnary, '123456', function(keyData, err) {
                    console.log(keyData);
               });
           });
        });
    </script>
</head>
<body>
<input id="browseOpen" type="file" />
</body>
</html>

--------------------------------------------------------------------------------------
ecp.js

function ecpReader(btnId, browseCallback) {
    var ecp = this;

    ecp.getkeyData = function(key, password, callback) {
        var p12Asn1 = forge.asn1.fromDer(key);
        var p12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, password);
        var bags = p12.getBags({bagType: forge.pki.oids.certBag});
        var cert = bags[forge.pki.oids.certBag][0];
        var subject = cert.cert.subject.attributes;
        var err = {};
        /**
         * Собираем данные из ключа
         **/
        var keyData = {};
        var index;
        for (index = subject.length - 1; index >= 0; --index) {
            var type = null;
            switch(subject[index]['type']) {
                case '2.5.4.7':
                    type = 'L';
                    break;
                case '2.5.4.3':
                    type = 'CN';
                    break;
                case '2.5.4.4':
                    type = 'SURNAME';
                    break;
                case '2.5.4.5':
                    type = 'SERIALNUMBER';
                    break;
                case '2.5.4.6':
                    type = 'C';
                    break;
                case '2.5.4.8':
                    type = 'ST';
                    break;
                case '2.5.4.10':
                    type = 'O';
                    break;
                case '2.5.4.11':
                    type = 'OU';
                    break;
                case '2.5.4.42':
                    type = 'GIVENNAME';
                    break;
                 case '1.2.840.113549.1.9.1':
                    type = 'E';
                    break;
                case '0.9.2342.19200300.100.1.25':
                    type = 'DC';
                    break;
            }
            if(type != null) {
                keyData[type] = forge.util.decodeUtf8(subject[index]['value']);
            }
        }
        keyData['before'] = cert.cert.validity.notBefore;
        keyData['after'] = cert.cert.validity.notAfter;
        callback(keyData, err);
    }

    // key reader
    var fileInput = document.getElementById(btnId);
    fileInput.onchange = function () {
        var fr = new FileReader();
        fr.onloadend = function () {
            var byteMask = fr.result;
            browseCallback(byteMask);
        };
        fr.readAsBinaryString(this.files[0], 'UTF-8');
    };
}





------------------------------
В keyData будут атрибуты.

Попытки прочитать ключ GOST из p12 контейнера закончились неудачей,
поскольку у нас криптопровайдер kalkan.
Остальные проблемы решаемые.
gostcrypto.com/
github.com/rudonick/crypto
www.npmjs.com/package/node-gost
WebCrypto GOST Library
Pure Javascript implementation of WebCrypto API interfaces and
Public Key Infrastructure for GOST algorithms (Russian Cryptographic Standards)
Изменено: 2 года, 1 мес. назад от vprokof.

Re: Реализация на javascript 2 года, 1 мес. назад #3243

  • vprokof
  • Осваиваюсь на форуме
  • Постов: 28
  • Репутация: 0
Для пошаговой отладки рекомендуется установить debugger
github.com/node-inspector/node-inspector

реализация PKCS #7 «Cryptographic Message Syntax Standard»
получилась такой:

var forge = require('node-forge');
var fs = require('fs');

var keyFile = fs.readFileSync("./RSA256_......p12", 'binary');

var p12Asn1 = forge.asn1.fromDer(keyFile);

// pkcs12 с паролем
var p12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, '123456');

var bags = p12.getBags({bagType: forge.pki.oids.certBag});

// Сертификат
var certBag = bags[forge.pki.oids.certBag][0];
var cert = certBag.cert;
//console.log(forge.pki.certificateToPem(cert));
//-----BEGIN CERTIFICATE-----

// Приватный ключ
var keyBags = p12.getBags({bagType: forge.pki.oids.pkcs8ShroudedKeyBag});
var keyBag = keyBags[forge.pki.oids.pkcs8ShroudedKeyBag][0];
var privateKey = keyBag.key;
//console.log(forge.pki.privateKeyToPem(privateKey));
//-----BEGIN RSA PRIVATE KEY-----


// Публичный ключ, если нужно
var publicKey = forge.pki.setRsaPublicKey(privateKey.n, privateKey.e);
//console.log(forge.pki.publicKeyToPem(publicKey));
//-----BEGIN PUBLIC KEY-----


// create a p7 enveloped message
var p7 = forge.pkcs7.createEnvelopedData();

// add certificate as recipient
// шифруем сертификатом от соответствующего приватного ключа
p7.addRecipient(cert);

// set content
p7.content = forge.util.createBuffer();
p7.content.putString('content to be encrypted');

// encrypt
p7.encrypt();

//convert a message to PEM
var pem = forge.pkcs7.messageToPem(p7);
//console.log(pem);
//-----BEGIN PKCS7-----


// обратная операция. Дешифровка

// convert a message from PEM
p7 = forge.pkcs7.messageFromPem(pem);

var recipient = p7.findRecipient(cert);

// decrypt
// дешифруем приватным ключом от соответствующего сертификата
p7.decrypt(p7.recipients[0], privateKey);

console.log(p7.content.data);
// Должно показать
//content to be encrypted
Изменено: 2 года, 1 мес. назад от vprokof.
  • Страница:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
FaLang translation system by Faboba