javascript42
Главная
Все учебники
Блог
Учебник Jsrsasign
Введение в jsrsasign
Что такое jsrsasign и для чего он нужен
История и развитие библиотеки
Место jsrsasign в экосистеме криптографии JavaScript
Сравнение с Web Crypto API, node-forge и другими альтернативами
Поддерживаемые алгоритмы и стандарты
Лицензирование и правила использования
Установка и настройка
Подключение через npm
Подключение через CDN
Использование в браузере без сборщика
Интеграция с webpack и rollup
Интеграция с Vite
Использование в Node.js
Структура пакета и точки входа
Минификация и оптимизация подключения
Типизация: работа с TypeScript и файлами деклараций
Архитектура библиотеки
Общая структура модулей
Объект KJUR и пространства имён
Зависимость от jsbn и CryptoJS
Модуль crypto
Модуль asn1
Модуль asn1x509
Модуль asn1cms
Модуль asn1cades
Модуль asn1tsp
Модуль asn1ocsp
Модуль jws
Модуль jwt
Пространство имён KEYUTIL
Пространство имён X509
Пространство имён ASN1HEX
Внутренние вспомогательные функции
Основы кодирования и форматов данных
Шестнадцатеричное представление данных в jsrsasign
Base64 и Base64url: различия и конвертация
PEM-формат: структура и разбор
DER-кодирование
BER и CER: отличия от DER
Работа с байтовыми строками в JavaScript
Перекодирование между форматами
Утилиты KJUR.crypto.Util для работы с данными
Хеши и их представление
Работа с BigInteger через jsbn
ASN.1 — теория и практика
Что такое ASN.1 и зачем он нужен
Типы ASN.1: INTEGER, BIT STRING, OCTET STRING, NULL, OID
Типы ASN.1: SEQUENCE, SET, CHOICE, ANY
Типы ASN.1: UTF8String, PrintableString, IA5String и другие строки
Типы ASN.1: UTCTime и GeneralizedTime
TLV-структура: Tag, Length, Value
Чтение и интерпретация DER вручную
Модуль KJUR.asn1: базовые классы
Класс KJUR.asn1.DERInteger
Класс KJUR.asn1.DERBitString
Класс KJUR.asn1.DEROctetString
Класс KJUR.asn1.DERUTF8String
Класс KJUR.asn1.DERPrintableString
Класс KJUR.asn1.DERIA5String
Класс KJUR.asn1.DERNull
Класс KJUR.asn1.DERObjectIdentifier
Класс KJUR.asn1.DERSequence
Класс KJUR.asn1.DERSet
Класс KJUR.asn1.DERTaggedObject
Построение произвольных ASN.1-структур вручную
Разбор ASN.1 с помощью ASN1HEX
ASN1HEX.parse и обход дерева
Получение значений по индексу и пути
Отладка ASN.1-структур
Хеширование
Алгоритмы хеширования, поддерживаемые jsrsasign
Класс KJUR.crypto.MessageDigest
Хеширование строк и бинарных данных
Хеширование с обновлением состояния (update/digest)
Получение хеша в hex, base64 и других форматах
SHA-1: использование и известные ограничения
SHA-256, SHA-384, SHA-512
SHA-3 (Keccak)
RIPEMD-160
MD5 и его место в современных системах
HMAC: теория и назначение
Класс KJUR.crypto.Mac
HMAC-SHA256, HMAC-SHA512 и другие варианты
Практика: проверка целостности данных через HMAC
Симметричное шифрование
Обзор симметричного шифрования в jsrsasign
AES: режимы работы CBC, CTR, GCM
Класс KJUR.crypto.Cipher
Шифрование и расшифрование строк
Работа с ключами и векторами инициализации
Padding: PKCS#7 и его применение
DES и Triple DES
Практика: шифрование данных перед отправкой
Ограничения и рекомендации по использованию
Асимметричное шифрование и ключи
Основы RSA: математика без излишней теории
Основы ECC: кривые и операции
Класс RSAKey
Генерация RSA-ключей с помощью KEYUTIL.generateKeypair
Генерация EC-ключей
DSA: генерация ключей и параметры
Структура открытого и закрытого ключа
Экспорт ключей: KEYUTIL.getPEM
Импорт ключей: KEYUTIL.getKey
Загрузка ключей из PEM, DER, JWK
Работа с парольной защитой ключей (encrypted PEM)
Конвертация форматов ключей
Хранение ключей и меры безопасности
RSA-шифрование и расшифрование
RSA-OAEP: принцип работы
RSA-PKCS1v15: принцип работы и риски
Шифрование данных открытым ключом
Расшифрование данных закрытым ключом
Ограничение на размер шифруемых данных
Гибридное шифрование: RSA + AES на практике
Практика: защищённая передача симметричного ключа
Цифровые подписи
Математические основы подписи
Подписи на основе RSA: PKCS#1 v1.5
RSA-PSS: улучшенная схема подписи
ECDSA: подпись на эллиптических кривых
DSA: классическая подпись
Класс KJUR.crypto.Signature
Инициализация объекта подписи
Метод updateString и updateHex
Создание подписи: sign
Проверка подписи: verify
Алгоритмы подписи: полный список поддерживаемых
Работа с хешем перед подписью
Подпись файлов и бинарных данных
Detached и embedded подписи
Практика: подпись HTTP-запросов
Сертификаты X.509
Структура сертификата X.509 v3
Расширения сертификата: обзор
Чтение сертификата с помощью X509
X509.readCertPEM и X509.readCertHex
Получение версии, серийного номера, алгоритма
Получение subject и issuer
Разбор DN: страна, организация, CN и другие поля
Получение дат действия: notBefore и notAfter
Извлечение открытого ключа из сертификата
Расширение Subject Alternative Name (SAN)
Расширение Key Usage и Extended Key Usage
Расширение Basic Constraints
Расширение Subject Key Identifier и Authority Key Identifier
Расширение CRL Distribution Points
Расширение Authority Information Access (AIA)
Расширение Certificate Policies
Fingerprint сертификата
Построение сертификата с помощью KJUR.asn1.x509
Класс KJUR.asn1.x509.Certificate
Класс KJUR.asn1.x509.TBSCertificate
Формирование DN через KJUR.asn1.x509.X500Name
Добавление расширений при построении
Самоподписанный сертификат: пошаговое построение
Подпись сертификата закрытым ключом CA
Цепочки сертификатов и проверка доверия
Понятие цепочки сертификатов
Root CA, Intermediate CA и End-Entity сертификаты
Проверка подписи сертификата
Ручная верификация цепочки
Проверка срока действия
Проверка Key Usage
Проверка CN и SAN
Ограничения jsrsasign при работе с цепочками
Интеграция с браузерным хранилищем доверия
CRL и OCSP
Что такое CRL и зачем он нужен
Структура CRL: поля и расширения
Разбор CRL с помощью KJUR.asn1.x509.CRL
Проверка отзыва по CRL
Что такое OCSP и чем отличается от CRL
Формат OCSP-запроса
Формат OCSP-ответа
Построение OCSP-запроса: KJUR.asn1.ocsp
Разбор OCSP-ответа
Практика: проверка статуса сертификата через OCSP
JSON Web Tokens (JWT)
Структура JWT: header, payload, signature
Алгоритмы подписи JWT в jsrsasign
Создание JWT с помощью KJUR.jws.JWS.sign
Проверка JWT с помощью KJUR.jws.JWS.verify
Работа с алгоритмом HS256, HS384, HS512
Работа с RS256, RS384, RS512
Работа с ES256, ES384, ES512
Работа с PS256, PS384, PS512
Стандартные claims: iss, sub, aud, exp, nbf, iat, jti
Кастомные claims
Проверка exp и nbf
Небезопасный JWT: alg none и защита от него
Класс KJUR.jws.IntDate и работа со временем
Практика: аутентификация через JWT
JSON Web Keys (JWK)
Формат JWK: структура и поля
JWK для RSA: n, e, d, p, q
JWK для EC: crv, x, y, d
JWK для симметричных ключей: k
Конвертация PEM → JWK
Конвертация JWK → PEM
KEYUTIL.getKey из JWK-объекта
KEYUTIL.getPEM в формат JWK
JSON Web Key Set (JWKS): структура
Практика: загрузка JWKS с сервера авторизации
Практика: верификация JWT через JWKS
JSON Web Signature (JWS)
Отличие JWS от JWT
Compact Serialization
JSON Serialization
Построение JWS вручную
Класс KJUR.jws.JWS
Подпись произвольного payload
Верификация JWS
Использование нескольких подписей в JSON Serialization
Защита заголовка: crit параметр
Практика: подпись API-ответов
JSON Web Encryption (JWE)
Обзор возможностей jsrsasign в части JWE
Что jsrsasign поддерживает, а что нет
Алгоритмы управления ключом
Алгоритмы шифрования содержимого
Структура JWE Compact Serialization
Варианты реализации JWE в связке с другими библиотеками
CMS (Cryptographic Message Syntax)
Что такое CMS и где применяется
Типы ContentInfo: data, signedData, envelopedData, digestedData
Класс KJUR.asn1.cms.SignedData
Формирование SignedData
SignerInfo: атрибуты и структура
Signed attributes: contentType, messageDigest, signingTime
Unsigned attributes
Добавление сертификатов в SignedData
Верификация SignedData
EnvelopedData: структура
RecipientInfo: KeyTransRecipientInfo
Практика: создание CMS-подписи документа
Практика: проверка CMS-подписи
CAdES (CMS Advanced Electronic Signatures)
Стандарт CAdES и уровни подписи
CAdES-BES: базовая электронная подпись
CAdES-T: подпись с меткой времени
CAdES-C, CAdES-X, CAdES-XL, CAdES-A: обзор
Атрибуты CAdES в jsrsasign
Класс KJUR.asn1.cades.SignaturePolicyIdentifier
Класс KJUR.asn1.cades.SignatureTimeStamp
Класс KJUR.asn1.cades.CompleteCertificateRefs
Практика: формирование CAdES-BES
Практика: добавление метки времени (CAdES-T)
TSP (Time-Stamp Protocol)
Стандарт RFC 3161 и его назначение
Структура TimeStampRequest
Структура TimeStampResponse
Структура TSTInfo
Класс KJUR.asn1.tsp.TimeStampReq
Класс KJUR.asn1.tsp.TimeStampResp
Класс KJUR.asn1.tsp.TSTInfo
Формирование запроса к TSA-серверу
Разбор и верификация ответа TSA
Практика: получение метки времени от публичного TSA
Практика: встраивание метки времени в CMS
PKCS-стандарты в jsrsasign
PKCS#1: RSA-ключи и подписи
PKCS#5: шифрование закрытых ключей паролем
PKCS#7: предшественник CMS
PKCS#8: формат закрытого ключа
PKCS#10: запрос на сертификат (CSR)
Построение CSR с помощью KJUR.asn1.csr
Класс KJUR.asn1.csr.CertificationRequest
Поля CSR: subject, publicKey, attributes
Подпись CSR закрытым ключом
Разбор CSR
PKCS#12: хранилище ключей (ограничения jsrsasign)
Эллиптические кривые в деталях
Поддерживаемые кривые: secp256r1, secp384r1, secp521r1
Кривые Кобица: secp256k1
Кривые NIST и их параметры
Кривые RFC 8422
Генерация ключей на конкретной кривой
Работа с координатами точек
ECDH: обмен ключами на эллиптических кривых
Практика: ECDH-рукопожатие
EdDSA и ограничения jsrsasign
Работа с OID
Что такое OID и как он устроен
Реестр OID в jsrsasign: KJUR.asn1.x509.OID
Конвертация OID ↔ строка
OID алгоритмов хеширования
OID алгоритмов подписи
OID расширений сертификата
OID атрибутов DN
Добавление собственных OID
Поиск OID по имени и наоборот
Безопасность и уязвимости
Алгоритмы, считающиеся устаревшими
Атака на RSA PKCS#1 v1.5 (Bleichenbacher)
Атаки на ECDSA при повторном использовании nonce
Небезопасное хранение ключей в браузере
Сторонние атаки через side-channel
alg confusion атаки в JWT
Подмена алгоритма none в JWT
Безопасная генерация случайных чисел
Проверка всех полей перед доверием данным
Рекомендации по минимальному размеру ключей
Устаревшие функции jsrsasign и их замена
Интеграция и практические сценарии
Подпись и верификация данных между браузером и сервером
Взаимодействие jsrsasign и Web Crypto API
Взаимодействие jsrsasign и OpenSSL
Проверка сертификатов TLS вручную
Построение простого PKI на JavaScript
Реализация клиентской аутентификации по сертификату
Подпись PDF через PKCS#7 и внешние инструменты
Работа с электронной подписью по ГОСТ (ограничения)
Юридически значимая электронная подпись: требования и реализация
Отладка криптографических операций
Справочник API
X509: полный список методов
ASN1HEX: полный список методов
KJUR.crypto.MessageDigest: методы и параметры
KJUR.crypto.Mac: методы и параметры
KJUR.crypto.Signature: методы и параметры
KJUR.crypto.Cipher: методы и параметры
KJUR.jws.JWS: методы и параметры
KJUR.asn1: базовые классы и методы
KJUR.asn1.x509: классы и методы
KJUR.asn1.cms: классы и методы
KJUR.asn1.cades: классы и методы
KJUR.asn1.tsp: классы и методы
KJUR.asn1.ocsp: классы и методы
KJUR.asn1.csr: классы и методы
Строковые идентификаторы алгоритмов
Таблица поддерживаемых кривых
Таблица поддерживаемых OID