технические характеристики, расшифровка, ГОСТ, ТУ, применение 🚩5 сечений по цене от до
Провод БСО 36-1498 — это бортовой кабель из сшитой фторопластовой композиции.
Варианты поставки:
| Бухта | Катушка | Барабан |
5 товаров
- По 20
- По 60
- По 100
- Сортировать
- По возрастанию цены
- По убыванию цены
- По убыванию популярности
- По возрастанию популярности
- По убыванию кол-ва отзывов
- По возрастанию кол-ва отзывов
БCО 36-1498 2х0,12
В наличииБCО 36-1498 2х0,15
В наличии
БCО 36-1498 2х0,2
В наличии
-
БCО 36-1498 2х0,35
В наличии
БCО 36-1498 2х0,5
В наличии
ГОСТ БСО 36-1498
! Ни один ГОСТ не нормирует данный тип проводов.
Нормативная документация: ПБМИ.358300.001-2014ТУ
Код ОКПО: 3583
Расшифровка БСО 36-1498
- Б — Провод бортовой
- С — Тип изоляции (сплошная)
- О — оболочка из фторопластовой радиационно-сшиваемой композиции
3 — Номинальное напряжение 600В- 6 — Рабочая температура до +200°С
- 14 — Жила медная никелированная нормальной прочности
- 98 — Номер разработки
Конструкция провода БСО 36-1498
- Внутренний проводник — из скрученных медных никелированных проволок (5 класс гибкости для сечений 0,2-0,5 мм2, 4 класс гибкости для сечений 0,75-6 мм2 по ГОСТ 22483).
- Двухслойная изоляция — из фторопластовой радиационно-сшиваемой композиции.
- Сердечник — из скрученных изолированных жил (для многожильных проводов).

- Оболочка — из фторопластовой радиационно-сшиваемой композиции.
Технические характеристики БСО 36-1498
| Рабочее переменное напряжение | 600 В |
| Рабочее постоянное напряжение | 850 В |
| Электрическое сопротивление изоляции, пересчитанное на длину 1м и температуру +20°С | не менее 1х106 Ом*м |
| Минимальная наработка | при максимальной температуре эксплуатации — 10 000 часов при температуре среды при эксплуатации +100°С — 33 000 часов при значении повышенной температуры среды при эксплуатации +85°С — 100 000 часов |
| Строительная длина | по заказу потребителя |
| Диапазон температур эксплуатации | от -65°С до +200°С |
| Срок службы | не менее 25 лет |
Провода устойчивы к вибрационным нагрузкам и проявляют исключительную стойкость к прорезанию и истиранию.
Таблица сечений и маркоразмеры БСО 36-1498
| Число жил и номинальное сечение жилы, мм2 | Максимальный наружный диаметр, мм | Расчетная масса, кг/км | Электрическое сопротивление 1км жилы при 20°С, не более, Ом |
| 2х0,12 | 2,44 | 6,02 | 175,4 |
| 2х0,15 | 2,54 | 6,8 | 139,6 |
| 2х0,2 | 2,74 | 8,48 | 116,8 |
| 2х0,35 | 3,04 | 11,42 | 61,8 |
| 2х0,5 | 3,38 | 15,2 | 41,3 |
Аналоги БСО 36-1498
—
Где применяется
Провод предназначен:
- для фиксированного монтажа бортовой электрической сети авиационной техники и работы при напряжении 600В переменного тока частоты до 2 кГц и 850В постоянного тока.

🔺 Количество товара в каталоге 5 по цене от
🔺 Технические характеристики, фото, выбор по параметрам, оптовая и розничная продажа
🔺 Доставка по Москве и всей России
технические характеристики, расшифровка, ГОСТ, ТУ, применение 🚩5 сечений по цене от до
Провод БСО 36-1398 — это бортовой кабель из сшитой фторопластовой композиции.
Варианты поставки:
| Бухта | Катушка | Барабан |
5 товаров
- По 20
- По 60
- По 100
- Сортировать
- По возрастанию цены
- По убыванию цены
- По убыванию популярности
- По возрастанию популярности
- По убыванию кол-ва отзывов
- По возрастанию кол-ва отзывов
БCО 36-1398 2х0,12
В наличии
-
БCО 36-1398 2х0,15
В наличии
БCО 36-1398 2х0,2
В наличии
БCО 36-1398 2х0,35
В наличии
БCО 36-1398 2х0,5
В наличии
ГОСТ БСО 36-1398
! Ни один ГОСТ не нормирует данный тип проводов.
Нормативная документация: ПБМИ.358300.001-2014ТУ
Код ОКПО: 3583
Расшифровка БСО 36-1398
- Б — Провод бортовой
- С — Тип изоляции (сплошная)
- О — оболочка из фторопластовой радиационно-сшиваемой композиции
- 3 — Номинальное напряжение 600В
- 6 — Рабочая температура до +200°С
- 13 — Жила медная посеребренная нормальной прочности
- 98 — Номер разработки
Конструкция провода БСО 36-1398
- Внутренний проводник — из скрученных медных посеребренных проволок (5 класс гибкости для сечений 0,2-0,5 мм2, 4 класс гибкости для сечений 0,75-6 мм2 по ГОСТ 22483).
- Двухслойная изоляция — из фторопластовой радиационно-сшиваемой композиции.
- Сердечник — из скрученных изолированных жил (для многожильных проводов).

- Оболочка — из фторопластовой радиационно-сшиваемой композиции.
Технические характеристики БСО 36-1398
| Рабочее переменное напряжение | 600 В |
| Рабочее постоянное напряжение | 850 В |
| Электрическое сопротивление изоляции, пересчитанное на длину 1м и температуру +20°С | не менее 1х106 Ом*м |
| Минимальная наработка | при максимальной температуре эксплуатации — 10 000 часов при температуре среды при эксплуатации +100°С — 33 000 часов при значении повышенной температуры среды при эксплуатации +85°С — 100 000 часов |
| Строительная длина | по заказу потребителя |
| Диапазон температур эксплуатации | от -65°С до +200°С |
| Срок службы | не менее 25 лет |
Провода устойчивы к вибрационным нагрузкам и проявляют исключительную стойкость к прорезанию и истиранию.
Провода являются достаточно прочными и стойкими к жестким условиям эксплуатации, не распространяют горение, не подвержены воздействию авиационных жидкостей и влажности. Радиационная модификация значительно повышает стойкость к истиранию, улучшает высокотемпературные характеристики провода.
Таблица сечений и маркоразмеры БСО 36-1398
| Число жил и номинальное сечение жилы, мм2 | Максимальный наружный диаметр, мм | Расчетная масса, кг/км | Электрическое сопротивление 1км жилы при 20°С, не более, Ом |
| 2х0,12 | 2,44 | 6,02 | 175,4 |
| 2х0,15 | 2,54 | 6,8 | 139,6 |
| 2х0,2 | 2,74 | 8,48 | 116,8 |
| 2х0,35 | 3,04 | 11,42 | 61,8 |
| 2х0,5 | 3,38 | 15,2 | 41,3 |
Аналоги БСО 36-1398
—
Где применяется
Провод предназначен:
- для фиксированного монтажа бортовой электрической сети авиационной техники и работы при напряжении 600В переменного тока частоты до 2 кГц и 850В постоянного тока.

🔺 Количество товара в каталоге 5 по цене от
🔺 Технические характеристики, фото, выбор по параметрам, оптовая и розничная продажа
🔺 Доставка по Москве и всей России
Поиск — Энциклопедия угроз — Trend Micro USA
Ключевое слово: worm_autorun.bso
11849 Общий поиск | Показаны результаты: 1 — 20
Далее
операционные системы (ОС). Чтобы получить общее представление о поведении этого червя, обратитесь к диаграмме угроз, показанной ниже. Этот червь поступает через съемные носители. Он поступает в систему в виде файла
Эта программа-вымогатель попадает в систему в виде файла, удаленного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов. Он крадет определенную информацию из системы и/или
после автозапуска реестров: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run encReadmyAutoload = «{Malware path}\How to decrypt files.
html» HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows
brl brn БРАУЗЕР brs brw brx bsa bsd bsdl bsk bso bsp bst btd btf btif btinstall BTL btm btoa btr btx BUD bul bundle bup burntheme bvd bvp bwa bwd bwf bwi bwp bws bwt bwz BXF bxx bz bz2 bza bzabw
Этот троян попадает в систему в виде файла, сброшенного другим пользователем вредоносное ПО или как файл, неосознанно загружаемый пользователями при посещении вредоносных сайтов. Сведения о поступлении Этот троянец попадает в систему как
Это шпионское ПО попадает в систему в виде файла, сброшенного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов. Сведения о поступлении Это шпионское ПО попадает в систему как
Этот бэкдор попадает в систему в виде файла, сброшенного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов. Сведения о поступлении Этот бэкдор попадает в систему как
Это шпионское ПО попадает в систему в виде файла, сброшенного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов.
Сведения о поступлении Это шпионское ПО попадает в систему как
Этот троянец попадает в систему как файл, сброшенный другим вредоносным ПО, или как файл, неосознанно загружаемый пользователями при посещении вредоносных сайтов. Сведения о поступлении Этот троянец попадает в систему как
Этот троянец попадает в систему в виде файла, сброшенного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов. Сведения о поступлении Этот троянец попадает в систему как
Этот троянец попадает в систему как файл, сброшенный другим вредоносным ПО, или как файл, неосознанно загружаемый пользователями при посещении вредоносных сайтов. Сведения о поступлении Этот троянец попадает в систему как
Этот вирус-вымогатель попадает в систему в виде файла, удаленного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов. Он удаляет себя после выполнения. Шифрует файлы
Эта программа-вымогатель попадает в систему в виде файла, удаленного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов.
Он удаляет первоначально выполненную копию самого себя. It
Эта программа-вымогатель попадает в систему в виде файла, удаленного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов. Он шифрует файлы с определенными расширениями файлов.
Эта программа-вымогатель попадает в систему в виде файла, удаленного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов. Это снижает настройки безопасности Internet Explorer.
bpk bpl bpm bpmc bps bpw brd breaking_bad brh brl brs brx bsa bsk bso bsp bst btd btf btoa btx burnburntheme bvd bwd bwf bwp bxx bzabw c c2e c6 cadoc cae cag calca 9 camproj capt car 0 0 caro 9 Эта программа-вымогатель поступает в виде вложения в сообщения электронной почты, рассылаемые другими вредоносными/нежелательными программами или злоумышленниками. Он попадает в систему в виде файла, сброшенного другим вредоносным ПО, или в виде загруженного файла
Этот вымогатель попадает в систему в виде файла, сброшенного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов.
Это снижает настройки безопасности Internet Explorer.
Эта программа-вымогатель попадает в систему в виде файла, удаленного другим вредоносным ПО, или в виде файла, неосознанно загруженного пользователями при посещении вредоносных сайтов. Он подключается к определенным веб-сайтам для отправки и получения
Этот троянец попадает в систему в виде файла, сброшенного другим вредоносным ПО, или в виде файла, неосознанно загружаемого пользователями при посещении вредоносных сайтов. Сведения о поступлении Этот троянец попадает в систему как
Путь к скриптингу Firefox Sync/Lockwise: разбираемся с протоколом
Эта статья является частью серии статей о скриптах Firefox Sync/Lockwise.
- Путь к скриптингу Firefox Sync/Lockwise: существующие клиенты
- Путь к скриптингу Firefox Sync/Lockwise: разбираемся с протоколом
- Путь к скриптингу Firefox Sync/Lockwise: понимание BrowserID
- Путь к скриптингу Firefox Sync/Lockwise: гибридный OAuth
- Путь к скриптингу Firefox Sync/Lockwise: полный OAuth
В предыдущем посте мы обнаружили существующие клиенты Firefox Sync, один в
Python и один в Node.
js. Оба не обновлялись более 6
лет, но с некоторыми быстрыми исправлениями мы заставили их работать.
В целях обучения давайте извлечем код из node-fx-sync это необходимо для доступа к коллекциям Firefox Sync, и упростите его как насколько это возможно.
Первым шагом является аутентификация с помощью учетных записей Firefox. Затем нам нужно немного потанцевать с Firefox Sync TokenServer. это, в свою очередь, даст нам учетные данные для доступа к фактическому узлу Firefox Sync API. API синхронизации затем позволит нам запрашивать коллекции, которые мы можем расшифровать с помощью еще нескольких крипто волшебство.
Ниже я разобью это на части, а затем приведу полностью рабочий пример. что вы можете просто скопировать и запустить самостоятельно.
Сначала мы создаем экземпляр fxa-js-client для взаимодействия с API Аккаунтов Firefox.
Примечание: этот клиент не поддерживается, он был заменен на
fxa-auth-клиент
в этом пиаре год назад, но
этот более новый пакет не публикуется в npm, и поскольку он является частью
monorepo, мы также не можем установить его с GitHub с помощью npm.
GitPkg может помочь с этим, но я бы предпочел не вводить элемент косвенности при получении пакета, который Я дам пароль от своей учетной записи Firefox.
const AuthClient = требуется ('fxa-js-клиент')
константа authServerUrl = 'https://api.accounts.firefox.com/v1'
постоянный адрес электронной почты = '...'
постоянный проход = '...'
постоянный клиент = новый AuthClient (authServerUrl)
const creds = await client.signIn(электронная почта, пароль, {
ключи: правда,
причина: "логин"
})
Как мы видели ранее, установка Reason: 'login' необходима для
Войдите в систему, чтобы работать, не требуя кода разблокировки, отправленного на электронную почту пользователя.
Поскольку мы указали ключа: true получаем keyFetchToken и unwrapBKey в ответе, что позволяет нам получить ключи учетной записи.
Это пригодится позже.
const accountKeys = await client.accountKeys(creds.keyFetchToken, creds.unwrapBKey)
Далее нам нужно вызвать TokenServer
чтобы получить учетные данные для Firefox Sync API.
Существует два способа аутентификации на TokenServer: BrowserID и ОАут.
В этот момент я просто скопировал то, что клиент Mozilla Python и node-fx-sync делали, который использует BrowserID. Это также метод, который упоминается в большинстве, если не всю, то документацию я смог найти в сети и по сей день.
Позже я узнал, что OAuth — это новый рекомендуемый способ и последнее посты этого Серия объясняет, как это реализовать. Если вас не волнует BrowserID, вы можете сразу перейти к следующему разделу это объясняет, как получать и расшифровывать записи с узла синхронизации.
Протокол BrowserID
требует, чтобы мы сгенерировали асимметричную пару ключей, либо DSA, либо RSA.
Mozilla сделала броузер-id-crypto
пакет (ранее известный как jwcrypto ), чтобы помочь с его реализацией.
const {обещание} = требуется('утилизация')
const jwcrypto = требуется ('browserid-crypto')
требуют('browserid-crypto/lib/algs/ds')
требуют('browserid-crypto/lib/algs/rs')
const kp = await promisify(jwcrypto.
generateKeypair)({алгоритм: 'DS', размер ключа: 256})
// Также работает с RSA.
// const kp = await promisify(jwcrypto.generateKeypair)({ алгоритм: 'RS', размер ключа: 256 })
После генерации пары ключей нам нужно запросить Аккаунты Firefox server для создания подписанного сертификата нашего открытого ключа. Как задокументировано по API, срок действия сертификата задается в миллисекундах и может быть увеличен до 24 часов.
постоянная продолжительность = 1000 * 60 * 60 * 24
const { cert } = await client.certificateSign (creds.sessionToken, kp.publicKey.toSimpleObject(), продолжительность)
Затем мы генерируем «утверждение личности». (по сути JWT с пустой полезной нагрузкой) с помощью нашего закрытого ключа.
const tokenServerUrl = 'https://token.services.mozilla.com'
const signedObject = ожидание обещания (jwcrypto.assertion.sign) (
{},
{
аудитория: tokenServerUrl,
эмитент: authServerUrl,
expiresAt: Date.
now() + продолжительность
},
kp.secretKey
)
Объединив предыдущий сертификат с этим JWT, разделенным ~ символ (тильда), мы создаем «подтвержденное подтверждение личности»,
который мы сможем использовать в заголовке Authorization .
const backedAssertion = [cert, signedObject].join('~')
Мы также вычисляем заголовок X-Client-State , который представляет собой первые 32 байта.
дайджеста SHA-256 ключа синхронизации, как описано здесь.
константное крипто = требуется('крипто')
const syncKey = Buffer.from(accountKeys.kB, 'hex')
const clientState = crypto.createHash('sha256').update(syncKey).digest().slice(0, 16).toString('hex')
Теперь все готово для вызова TokenServer.
Я буду использовать node-fetch для
что.
константная выборка = требуется ('узловая выборка')
константный токен = ожидание выборки(`${tokenServerUrl}/1.0/sync/1.5`, {
заголовки: {
Авторизация: `BrowserID ${backedAssertion}`,
«X-клиент-состояние»: clientState
}
})
.
тогда(рес => res.json())
Это дает нам «URL-адрес узла хранилища синхронизации пользователя и некоторые краткосрочные учетные данные, которые можно использовать для доступа к нему», как задокументировано здесь.
Теперь у нас есть учетные данные для вызова Firefox Sync API.
Он использует аутентификацию Hawk,
поэтому мы напишем обёртку fetch , которая обработает это за нас.
Для удобства сделаем так, чтобы он брал токен, который мы получили от Sync TokenServer
ранее, так как он содержит все необходимое для выполнения Hawk
аутентификации, и мы будем использовать Hawk пакет, чтобы сделать тяжелую работу.
const Hawk = требуется('ястреб')
function hawkFetch (токен, путь, параметры = {}) {
постоянный URL = `${token.api_endpoint}/${путь}`
константа hawkOptions = {
реквизиты для входа: {
идентификатор: токен.id,
ключ: токен.ключ,
алгоритм: token.hashalg
}
}
если (params.body) {
hawkOptions.
payload = params.body
}
const authHeader = Hawk.client.header(url, params.method || 'get', hawkOptions)
вернуть выборку (url, Object.assign ({}, параметры, {
заголовки: Object.assign({
Авторизация: authHeader.header
}, параметры.заголовки)
}))
}
Затем мы можем использовать этот помощник для получения паролей:
const passwords = await hawkFetch(token, 'storage/passwords?full=true') .тогда(рес => res.json())
Но эти пароли зашифрованы! Если мы хотим получить доступ к реальному полезная нагрузка (включая домен, имя пользователя и пароль для каждой записи), мы нужно еще пару шагов.
Синхронизация хранит «коллекции», т.е. закладки, история, вкладки, пароли и более. Коллекции состоят из объектов, именуемых БСО (базовые объект хранения) и ранее известный как WBO (базовый объект Weave).
Каждый объект шифруется с помощью симметричного ключа, который хранится в
коллекция ключей, специальная коллекция, зашифрованная ключом, полученным из
пользовательский ключ синхронизации, который сам локально выводится из пароля пользователя,
эффективно делая Firefox Sync сквозной
зашифровано.
🤯
Ключи выбираются так же, как и пароли:
const cryptoKeys = await hawkFetch(токен, 'хранилище/крипто/ключи') .тогда(рес => res.json())
Чтобы расшифровать их, нам нужно получить пользовательский ключ синхронизации с помощью HKDF.
асинхронная функция производные ключи (syncKey) {
константная соль = ''
const info = 'identity.mozilla.com/picl/v1/oldsync'
const bundle = Buffer.from(ожидание обещания(crypto.hkdf)('sha256', syncKey, соль, информация, 64))
возвращаться {
ключ шифрования: bundle.slice(0, 32),
hmacKey: пакет.slice(32, 64)
}
}
const syncKey = Buffer.from(accountKeys.kB, 'hex')
const syncKeyBundle = ожидание производных ключей (syncKey)
Это дает нам пакет, содержащий ключ шифрования и ключ HMAC. записи шифруются с использованием AES-256-CBC и подписываются с помощью HMAC с использованием соответствующих ключей.
Мы напишем помощник decryptBSO , который использует связку ключей и BSO для
расшифровать, одновременно выполняя проверку HMAC.
функция decryptBSO (keyBundle, bso) {
константная полезная нагрузка = JSON.parse(bso.payload)
const hmac = crypto.createHmac('sha256', keyBundle.hmacKey)
.update(полезная нагрузка.зашифрованный текст)
.дайджест('шестнадцатеричный')
если (hmac !== полезная нагрузка.hmac) {
выдать новую ошибку («Несоответствие HMAC»)
}
const iv = Buffer.from(payload.IV, 'base64')
const decipher = crypto.createDecipheriv('aes-256-cbc', keyBundle.encryptionKey, iv)
константный открытый текст = decipher.update(payload.ciphertext, 'base64', 'utf8') + decipher.final('utf8')
константный результат = JSON.parse (открытый текст)
если (result.id !== bso.id) {
выдать новую ошибку («Несоответствие идентификатора записи»)
}
вернуть результат
}
Теперь мы можем адаптировать наш код для получения ключей, чтобы он также расшифровывал их.
const cryptoKeys = await hawkFetch(токен, 'хранилище/крипто/ключи') .тогда(рес => res.json()) .then(bso => decryptBSO(syncKeyBundle, bso))
Наконец, мы хотим расшифровать пароли, которые мы получили ранее.
ключи, которые мы только что получили, состоят из набора ключей по умолчанию , а также
необязательные специфичные для коллекции ключи , как определено в протоколе.
На практике встречал только дефолтные ключи, но все же поддерживаю ключи коллекции для будущей совместимости.
const encodedKeyBundle = cryptoKeys.collections.passwords || cryptoKeys.default
константная коллекцияKeyBundle = {
шифрованиеKey: Buffer.from(encodedKeyBundle[0], 'base64'),
hmacKey: Buffer.from(encodedKeyBundle[1], 'base64')
}
Обратите внимание, что переменная collectionKeyBundle совместима с keyBundle переходим к decryptBSO ? Вот так мы сможем
расшифруйте пароли!
const passwords = await hawkFetch(токен, 'хранение/пароли?полный=true') .тогда(рес => res.json()) .then(items => items.map(bso => decryptBSO(collectionKeyBundle, bso)))
И вуаля! Это все, что нам нужно для извлечения и расшифровки записей из Firefox.
Синхронизировать! Это
Только
взял
чтение
документация
из
14
другой
места
к
понять
как
Это
работает.
Запись данных зависит только от реализации encryptBSO , по сути
делает обратное тому, что делает decryptBSO , и отправляет
соответствующие запросы PUT или POST .
Я оставлю это в качестве упражнения читателю. 😉
Но это еще не все. Сначала я поделюсь с вами кодом, который мы создали в этом посте мы рассмотрим, как работает BrowserID (вы поймете почему).
const { обещание } = требуется ('использование')
константное крипто = требуется ('крипто')
константная выборка = требуется ('выборка узла')
const AuthClient = требуется ('fxa-js-клиент')
const jwcrypto = требуется ('browserid-crypto')
const Hawk = требуется ('ястреб')
требуют('browserid-crypto/lib/algs/ds')
требуют('browserid-crypto/lib/algs/rs')
константа authServerUrl = 'https://api.accounts.firefox.com/v1'
const tokenServerUrl = 'https://token.
services.mozilla.com'
постоянный адрес электронной почты = '...'
постоянный проход = '...'
// Получите пакет ключей синхронизации, как описано в
// чтобы получить пакеты ключей коллекции.
асинхронная функция производные ключи (syncKey) {
константная соль = ''
const info = 'identity.mozilla.com/picl/v1/oldsync'
const bundle = Buffer.from(ожидание обещания(crypto.hkdf)('sha256', syncKey, соль, информация, 64))
возвращаться {
ключ шифрования: bundle.slice(0, 32),
hmacKey: пакет.slice(32, 64)
}
}
// Расшифровать BSO (базовый объект хранения), ранее известный как WBO (базовый Weave).
// объект) в соответствии с .
функция decryptBSO (keyBundle, bso) {
константная полезная нагрузка = JSON.parse(bso.payload)
const hmac = crypto.createHmac('sha256', keyBundle.hmacKey)
.update(полезная нагрузка.
зашифрованный текст)
.дайджест('шестнадцатеричный')
если (hmac !== полезная нагрузка.hmac) {
выдать новую ошибку («Несоответствие HMAC»)
}
const iv = Buffer.from(payload.IV, 'base64')
const decipher = crypto.createDecipheriv('aes-256-cbc', keyBundle.encryptionKey, iv)
константный открытый текст = decipher.update(payload.ciphertext, 'base64', 'utf8') + decipher.final('utf8')
константный результат = JSON.parse (открытый текст)
если (result.id !== bso.id) {
выдать новую ошибку («Несоответствие идентификатора записи»)
}
вернуть результат
}
// Получить URL-адрес, используя аутентификацию Hawk в соответствии с
// .
//
// Ожидается, что токен придет из ответа Sync TokenServer
// как описано в .
function hawkFetch (токен, путь, параметры = {}) {
постоянный URL = `${token.api_endpoint}/${путь}`
константа hawkOptions = {
реквизиты для входа: {
идентификатор: токен.
id,
ключ: токен.ключ,
алгоритм: token.hashalg
}
}
если (params.body) {
hawkOptions.payload = params.body
}
const authHeader = Hawk.client.header(url, params.method || 'get', hawkOptions)
вернуть выборку (url, Object.assign ({}, параметры, {
заголовки: Object.assign({
Авторизация: authHeader.header
}, параметры.заголовки)
}))
}
асинхронная функция main () {
постоянный клиент = новый AuthClient (authServerUrl)
const creds = await client.signIn(электронная почта, пароль, {
ключи: правда,
причина: "логин"
})
const accountKeys = await client.accountKeys(creds.keyFetchToken, creds.unwrapBKey)
const kp = await promisify(jwcrypto.generateKeypair)({алгоритм: 'DS', размер ключа: 256})
// Также работает с RSA.
// const kp = await promisify(jwcrypto.generateKeypair)({ алгоритм: 'RS', размер ключа: 256 })
// Интервал времени в миллисекундах до истечения срока действия сертификата, до
// максимум 24 часа, как описано в com/mozilla/fxa/blob/f6bc0268a9be12407456fa42494243f336d81a38/packages/fxa-auth-server/docs/api.md#request-body-32>.
постоянная продолжительность = 1000 * 60 * 60 * 24
const { cert } = await client.certificateSign (creds.sessionToken, kp.publicKey.toSimpleObject(), продолжительность)
// Генерируем "утверждение идентичности", которое является JWT, как описано в
// .
const signedObject = ожидание обещания (jwcrypto.assertion.sign) (
{},
{
аудитория: tokenServerUrl,
эмитент: authServerUrl,
expiresAt: Date.now() + продолжительность
},
kp.secretKey
)
// Сертификаты разделяются символом `~`, как описано в .
const backedAssertion = [сертификат, подписанный объект].join('~')
// См. .
const syncKey = Buffer.
from(accountKeys.kB, 'hex')
const clientState = crypto.createHash('sha256').update(syncKey).digest().slice(0, 16).toString('hex')
константный токен = ожидание выборки(`${tokenServerUrl}/1.0/sync/1.5`, {
заголовки: {
Авторизация: `BrowserID ${backedAssertion}`,
«X-клиент-состояние»: clientState
}
})
.тогда(рес => res.json())
const syncKey = Buffer.from(accountKeys.kB, 'hex')
const syncKeyBundle = ожидание производных ключей (syncKey)
// См.
// для конечных точек и аутентификации.
const cryptoKeys = await hawkFetch(токен, 'хранилище/крипто/ключи')
.тогда(рес => res.json())
.then(bso => decryptBSO(syncKeyBundle, bso))
const encodedKeyBundle = cryptoKeys.collections.passwords || cryptoKeys.default
константная коллекцияKeyBundle = {
шифрованиеKey: Buffer.from(encodedKeyBundle[0], 'base64'),
hmacKey: Buffer.from(encodedKeyBundle[1], 'base64')
}
const passwords = await hawkFetch(токен, 'хранение/пароли? полный=true')
.
тогда(рес => res.json())
.then(items => items.map(bso => decryptBSO(collectionKeyBundle, bso)))
console.log(пароли)
}
главный()
Это работает как шарм, но меня все еще беспокоит одна вещь. При запуске code, я вижу предупреждение об устаревании в консоли.
[DEP0005] DeprecationWarning: Buffer() устарел из-за проблем с безопасностью и удобством использования. Вместо этого используйте методы Buffer.alloc(), Buffer.allocUnsafe() или Buffer.from().
Это исходит от browserid-crypto, поэтому я сделал PR, чтобы исправить это, и пока он был принят, сопровождающий указал мне что эту библиотеку следует считать неподдерживаемой:
FWIW, было бы лучше считать эту библиотеку неподдерживаемой на данный момент. точка, но я все равно рад принять небольшие исправления, подобные этому.
Хотя нет ничего плохого в использовании неподдерживаемой библиотеки до тех пор, пока
как это работает, мне было любопытно посмотреть, что потребуется, чтобы удалить
пакет browserid-crypto из моих зависимостей.





generateKeypair)({алгоритм: 'DS', размер ключа: 256})
// Также работает с RSA.
// const kp = await promisify(jwcrypto.generateKeypair)({ алгоритм: 'RS', размер ключа: 256 })
тогда(рес => res.json())
payload = params.body
}
const authHeader = Hawk.client.header(url, params.method || 'get', hawkOptions)
вернуть выборку (url, Object.assign ({}, параметры, {
заголовки: Object.assign({
Авторизация: authHeader.header
}, параметры.заголовки)
}))
}
services.mozilla.com'
постоянный адрес электронной почты = '...'
постоянный проход = '...'
// Получите пакет ключей синхронизации, как описано в
зашифрованный текст)
.дайджест('шестнадцатеричный')
если (hmac !== полезная нагрузка.hmac) {
выдать новую ошибку («Несоответствие HMAC»)
}
const iv = Buffer.from(payload.IV, 'base64')
const decipher = crypto.createDecipheriv('aes-256-cbc', keyBundle.encryptionKey, iv)
константный открытый текст = decipher.update(payload.ciphertext, 'base64', 'utf8') + decipher.final('utf8')
константный результат = JSON.parse (открытый текст)
если (result.id !== bso.id) {
выдать новую ошибку («Несоответствие идентификатора записи»)
}
вернуть результат
}
// Получить URL-адрес, используя аутентификацию Hawk в соответствии с
//
id,
ключ: токен.ключ,
алгоритм: token.hashalg
}
}
если (params.body) {
hawkOptions.payload = params.body
}
const authHeader = Hawk.client.header(url, params.method || 'get', hawkOptions)
вернуть выборку (url, Object.assign ({}, параметры, {
заголовки: Object.assign({
Авторизация: authHeader.header
}, параметры.заголовки)
}))
}
асинхронная функция main () {
постоянный клиент = новый AuthClient (authServerUrl)
const creds = await client.signIn(электронная почта, пароль, {
ключи: правда,
причина: "логин"
})
const accountKeys = await client.accountKeys(creds.keyFetchToken, creds.unwrapBKey)
const kp = await promisify(jwcrypto.generateKeypair)({алгоритм: 'DS', размер ключа: 256})
// Также работает с RSA.
// const kp = await promisify(jwcrypto.generateKeypair)({ алгоритм: 'RS', размер ключа: 256 })
// Интервал времени в миллисекундах до истечения срока действия сертификата, до
// максимум 24 часа, как описано в
from(accountKeys.kB, 'hex')
const clientState = crypto.createHash('sha256').update(syncKey).digest().slice(0, 16).toString('hex')
константный токен = ожидание выборки(`${tokenServerUrl}/1.0/sync/1.5`, {
заголовки: {
Авторизация: `BrowserID ${backedAssertion}`,
«X-клиент-состояние»: clientState
}
})
.тогда(рес => res.json())
const syncKey = Buffer.from(accountKeys.kB, 'hex')
const syncKeyBundle = ожидание производных ключей (syncKey)
// См.
тогда(рес => res.json())
.then(items => items.map(bso => decryptBSO(collectionKeyBundle, bso)))
console.log(пароли)
}
главный()