Как отличить непрозрачные объекты JS?
API WebCrypto вводит понятие неэкспортируемых закрытых ключей, которые можно экспортировать в IndexDB, но не в LocalStorage или через Интернет. Это хорошо объясняется в блоге Чарльза Энглика " Сохранение криптографических ключей в браузере".
Но как эти объекты на самом деле работают? Есть ли способ узнать из JS, если объект непрозрачный или нет? У меня проблемы с поиском какой-либо информации по этому вопросу.
1 ответ
Там нет волшебного "непрозрачного флага" нигде. "Непрозрачный" здесь просто означает, что в объекте содержатся данные, которые никогда не будут видны сценарию. Вы все еще можете выполнять некоторые операции с CryptoKey
экземпляр - например, в этом случае, сохранить его в индексированной БД или отправить в другой контекст через postMessage()
,
Это в отличие от, например, Blob
объект, в котором все хранимые данные могут быть проверены либо напрямую через атрибуты объекта, либо косвенно через FileReader
,
Другим непрозрачным примером будет Response
объект в результате операции извлечения перекрестного происхождения, которая может быть обработана сервисным работником, но тело не может быть проверено.
Итак, "есть ли способ узнать из JS, если объект непрозрачный?" - это зависит. Если объект является экземпляром CryptoKey
тогда вы знаете, что есть скрытые данные, поэтому они непрозрачны. Если объект является экземпляром Blob
тогда вы знаете, что есть способ доступа к данным, даже если вам нужны другие API для доступа к ним, поэтому они не непрозрачны. Если объект является экземпляром Response
это может быть непрозрачным, в зависимости от источника.