Копирование некопируемого контейнера ЭЦП с Рутокена
Запускаем КриптоПро переходим на вкладку Сервис, там нажимаем кнопку Скопировать и выбираем носитель на который нужно скопировать ЭЦП Инструкцию по копированию ЭЦП в КриптоПро.
Но в этот раз контейнер электронной подписи просто так не скопировался, Вместо этого появилась следующая ошибка: Ошибка копирования контейнера имя контейнера. У вас нет разрешений на
экспорт ключа, потому что при создании ключа не был установлен соответствующий флаг. Ошибка: Ключ не может быть использован в указанном состоянии.

Дело в том, что контейнер цифровой подписи находится на Рутокене и имеет признак «Неэкспортируемый». Но экспортировать такой контейнер всё же можно. Копирование ЭЦП с Рутокена выполнять нужно с помощью специальной программы — tokens.exe. Скачать эту программу вы можете с сайта контура перейдя по ссылке.
Запустите tokens.exe, после чего эта программа обнаружит все ЭЦП на Рутокене. Возле нужного контейнера нажмите кнопку Экспорт и укажите путь к флеке на которую хотите скопировать контейнер электронной подписи.
После проделанного программа КриптоПро должна увидеть только что скопированный контейнер. Но это ещё не всё. Контейнер ЭЦП вы скопировали на флешку, но он продолжает быть неэкспортируемым. То есть вы не сможете сделать копию контейнера с помощью КриптоПро на другую флешку или в реестр. Чтобы это исправить воспользуемся ещё одной утилитой она также размещена на сайте Контура и называется Certfix.
Запустите Certfix, после чего загрузится список сертификатов. Дальше нужно зажать клавишу SHIFT на клавиатуре и правой кнопкой мыши кликнуть по нужному контейнеру. Появится меню «Сделать экспортируемым».

Если на контейнер указан пароль потребуется его ввести.
Далее можно копировать в реестр или на флешку, с помощью средств КриптоПро.
Token consumed что это в реестре
found a registry value called TOKEN_CONSUMED in HKCU(Computer\HKEY_CURRENT_USER)and its data is 1should i delete it or change it to 0this is the first time ive ever seen TOKEN_CONSUMED anywherei found out about it seeing how my network driver was corrupted and i happened to open HKCU(got an error message saying that some registry data for it was corrupted, i found the driver from getting the driver key in device manager but ive never seen any driver data in the registry so i just ended up doing a network reset lol)PLEASE FOR THE LOVE OF GOD DON’T GIVE ME A CANNED RESPONSE
Token consumed что это в реестре
found a registry value called TOKEN_CONSUMED in HKCU(Computer\HKEY_CURRENT_USER)and its data is 1should i delete it or change it to 0this is the first time ive ever seen TOKEN_CONSUMED anywherei found out about it seeing how my network driver was corrupted and i happened to open HKCU(got an error message saying that some registry data for it was corrupted, i found the driver from getting the driver key in device manager but ive never seen any driver data in the registry so i just ended up doing a network reset lol)PLEASE FOR THE LOVE OF GOD DON’T GIVE ME A CANNED RESPONSE
Windows 10 HKCU "TOKEN_CONSUMED" 1
found a registry value called TOKEN_CONSUMED in HKCU(Computer\HKEY_CURRENT_USER)and its data is 1should i delete it or change it to 0this is the first time ive ever seen TOKEN_CONSUMED anywherei found out about it seeing how my network driver was corrupted and i happened to open HKCU(got an error message saying that some registry data for it was corrupted, i found the driver from getting the driver key in device manager but ive never seen any driver data in the registry so i just ended up doing a network reset lol)PLEASE FOR THE LOVE OF GOD DON’T GIVE ME A CANNED RESPONSE
Token consumed что это в реестре
Token Age Consumed — Technical Details
We will describe here one statistic that we call the token age consumed . This is a measurement that detects changes in the volume of the token circulation and can show us when tokens that have been frozen for a long time come into circulation. We have computed this measurement for all ERC20 tokens. In theory it can be calculated for any cryptocurrency which has publicly readable transactions (so not like #ZEC or #XMR)
To understand the token age consumed, we need to rethink our idea of a token account. At any given moment, an account has a value which is a single number. But this number is a result of transactions coming in and going out of the account. Some of those transactions happened a very long time ago, while others happened only recently.
Let's look at the following example. Assume that Alice and Bob have each one account of SAN tokens. Both of them have 10000 tokens. Alice bought her tokens 4 months ago and didn't move them. Bob, on the other hand, was buying and selling large amounts of tokens the whole time. So we can imagine that Alice's tokens were out of circulation for the entire four months, while Bob's tokens were in circulation. In this scenario, it is not a significant event if Bob transfers 5000 of his tokens today. But it is much more critical if Alice transfers 5000 tokens. The token age consumed is a measurement that will tell us if many people suddenly start transferring tokens that have not moved for a long time.
To understand how the token age consumed is calculated, imagine that the coins in each account are ordered as a stack: Incoming transactions put money on top of the stack, and outgoing transactions take money from the top. For every portion of this stack, we can note the block number of the corresponding incoming transaction. So for any given block number and any account , we can construct a stack that describes the account's history at that block number. We have
Here are token amounts, and are block numbers. Also, the sum equals the current balance of the account.
Assume that the current block number is . There are several cases regarding the account :
In that case the contribution (token age consumed) of the account towards the token age consumed at block is 0.
In that case, we need to put the amount of the incoming transaction at the top of our stack. If that amount was , the new stack becomes
In that case the contribution of the account towards the token age consumed at block is 0.
The outgoing transaction will consume the elements at the top of the stack. If the amount of the transaction was , then all elements such that will be completely consumed. Let be the smallest such index . The element might be partially consumed if there was any amount left from the outgoing transaction. So the new stack will become
In the case of an outgoing transaction, the account contributed to the token age consumed at block . Its contribution is:
which means all elements will be fully consumed, and their age is added to the whole contribution, while the last consumed stack can be only partially consumed.
If there were multiple incoming and/or outgoing transactions happening at the same block number , we replace them in our calculations with a single transaction. This transaction will be incoming if the total incoming amount is greater than the total outgoing amount, and it will be outgoing. So we can reduce this case to one of the cases we described above.
After we have computed the token age consumed contribution at block for every account, we can calculate the total token age consumed:
Imagine again that Alice and Bob are exchanging tokens. Initially, Alice had 5000 tokens, which she obtained at block 0, and Bob doesn't have any tokens.
First, Alice transfers 1000 tokens to Bob at block 5. Her transaction stack has a single element and 1000 tokens are consumed from it, contributing token age consumed for block 5. Now Alice transaction stack is and Bob transaction stack is .
Later Bob decides to move these tokens to an exchange and sell them, so at block 15 Bob transfers his tokens to an exchange wallet, which contributes token age consumed to block 15. On the other hand Alice transfers 2000 tokens to Bob at the same block 15, which makes the total token age consumed for block 15 . The transaction stacks of Alice is , while the stack of Bob is .
At block 25, both Alice and Bob decide to transfer their tokens to an exchange, contributing to the total token age consumed for block 25.
Updated 1 year ago
Talk to us in Discord
Still have some questions left? Join our Discord and get help from the Santiment team!
How to secure ASP.NET Core with OAuth and JSON Web Tokens
OAuth 2.0 is an authorization standard, that you probably already used somehow. When a service needs information from your GitHub or Google account, you authorize that using OAuth before they can get the data. To secure your API with OAuth there are a couple of options already like Identity Server 4, OpenIddict, and ASOS. But these packages all either require you to use a relational database like MSSQL, set up additional web applications and/or offer too many options which can make it confusing and hard to learn. In this article, I will show how you can use JSON Web Tokens (JWT) to implement the OAuth 2.0 Authorization Code flow directly with ASP.NET Core while keeping your choice of persistent storage open.

The Authorization Code flow
There are a lot of different flows under OAuth 2.0 that can be used in different scenarios. The goal of all the flows is to get an access token, though. The access token is what can be used to query an API to get the information requested access to. The most used flow in modern applications for both mobile and web is the Authorization Code flow. A lot of the other flows handle all communication with the authorization server internally and does not expose the user to the other service. The way the Authorization Code flow exposes the user to the Authorization server is through the browser. It’s important to use HTTPS for this standard since there is a lot of communication between the different actors with arguments that should not be known to potential eavesdroppers. The following figure shows the flow.

Authorization code request and response
First, the client is redirected to the website of the authorization server. Here the user must first authenticate themselves which can be done using cookie authentication when using ASP.NET Cone as explained in this post: Cookie authentication with social providers in ASP.NET Core. In the redirect, the client must attach some arguments: response_type which must be "code" since we use the Authorization Code flow. client_id specifying the client since only registered clients should be allowed to use the Authorization server. redirect_uri specify the URI that the server should redirect back to once the access is authorized. state is a random string that is used to identify the flow. The client must also authenticate itself which can either be done using HTTP Basic Authentication or by using the extra argument client_secret which contains a secret password known to the client.
The action that receives these parameters could look like this.
The action has an [Authorize] attribute on it because we need to be logged in, to know which user we want to authorize. When using cookie authentication, ASP.NET Core will automatically redirect the user to the login page to ensure that they get logged in before getting to authorize. We validate that the code response_type is "code" and respond with an error if it is not. We also check that the client_id and client_secret are valid. These credentials could be stored in a table in your database, as a file in Azure Blob storage, or if you know that your clients rarely change (or for tests) as a hardcoded dictionary.
Would your users appreciate fewer errors?
Then the authorization code is generated and the user’s Name is fetched. If you use cookie authentication then the Name will be stored somewhere in Claims specific to your implementation. The user’s Name and the redirect_uri are saved in a place where it can be fetched using the code later. This could again be saved in a table in your database or using some other persistent storage like Azure Blob storage. The code should be available for a couple of minutes only and is normally consumed within seconds. Lastly, the variables that are needed for the response are added to the ViewBag and the View is returned. A simple view could be implemented like this:
The user is redirected back to the client through this link and the client receives the authorization code and checks that the state is the same as they sent.
Access token request and response
Now that the client has the authorization code , it can request an access token by sending the code . This request also has to include the arguments: grant_type which needs to be set to "authorization_code" . redirect_uri which has to be identical redirect_uri in the first request. client_id as in the previous request. And also, a client_secret if you choose this as your client authentication. The action that receives this could look like this:
This action, differently from the previous action, takes its arguments through a post. This means that you have to extract each parameter using the attribute [FromForm] . An alternative would be to make a model for the post, but for this purpose, we took the simpler, but slightly more messy approach. First, in the body, the grant_type and client credentials are checked, similar to the start of our previous action. Then previous_uri and user are fetched from where they were stored just before. After this, they are deleted so that each authorization code can only be used once to create a valid access token. We then check that previous_uri is the same as redirect_uri which ensures that this code came from the same client. We also check is the user is not null meaning that the code was actually a real authorization code and that it had not been used before.
Now we’ve come to the part where we make the access token. Our access token is a JSON Web Token (JWT). A JWT is a standard for representing claims for resources within some scope, time, and audience. We set the Subject to a new ClaimsIdentity that contains the user in the field Name which will be used to identify which user this token is for once it is used. We set it to expire in 2 years which is a long time, but we will get back to this later. We set the Issuer and Audience to the same website since we will create and consume the token in the same application in this example. We set the SigningCredentials using a symmetric security key since this application is the only one that will need to make and validate the tokens. We retrieve this symmetric security key from Configuration which is always automatically injected into all controllers. Configuration can reference your appsettings.json file or even better your User Secrets as explained in our article ASP.NET Core (not that secret) User Secrets Explained.
Finally, the token is created and serialized as a string. When the token is created it uses the whole content of the JWT together with the SigningCredentials to make a signature. This makes it so that no person can modify the token. Everyone can read it, but only we can make them and check if their signature is correct. If your way of identifying your users should not be visible to everyone with a token, you could look into using a JWE instead, which encrypts the content of the token. Finally, we return the access_token to the client and specify that it is a bearer token by setting the token_type to "bearer" . This means that everyone with this token can use it without using any other cryptographic key or identification.
Consuming the access_token in your API
Now we need to find some way of checking if the access_token is valid and extract its content so that we can use it. Luckily, .NET makes this easy for us. In Startup.cs after you’ve added authentication you add the following:
We first create the symmetric security key similar to how we did it previously. We then add JWT Bearer as an authentication option in the same place that cookie authentication is added. We first set the SaveToken to true so that the claims will be available through User.Claims . The options for the token validation are like the fields we used when we created the token, except we only use the ones relevant to the signature and the token’s validity.
Next, we add an authorization policy for the application that specifies that it needs a JWT Bearer token for actions/controllers that use this policy. In the startup, we also need to add that the application uses authentication and authorization if it did not already do so:
Now, you simply add the policy in an attribute to the action that you wish to validate using the JWT as shown here:
This action is rather simple, but it shows the basic idea. You can use the action as any other action, but you also have access to the content of the JWT. It is common that an authorization server also has an endpoint that identifies the user who made the token like this Me action. The access token can be passed to your application now by adding a field to the header of the request to your application called Authorization which has the content "Bearer <access_token>" (The word Bearer followed by a space and then your access token).
Possible improvements
When we constructed the access token, we made a notice about the expiration time of the token. We set it to 2 years which is quite a long time, but in some cases, you want a long-lived token. It is recommended that the access token is short-lived in the documentation for the OAuth 2.0 standard. A way that this can be achieved while still not having to re-authorize every hour is to use a refresh token. A refresh token could simply be a long random string. It works in a way where you can use a refresh token together with an expired access token to get a new access token. The refresh token would then be generated at the same time as the first access token and saved in some persistent storage with a connection to the user. When the refresh token is handed in, the user can be checked from the invalidated access token and the refresh token can be compared to the one in persistent storage for that specific user and be removed so that it cannot be used twice. It is important that the refresh token is stored safely and that it is never transported without TLS or exposed in a URI or in the browser since this opens up for possible attacks. It makes the access token safer to use since the application’s safety wouldn’t be compromised if an adversary got an access token, but it also makes it so that you have to save one more thing in persistent storage.
Do you monitor for authentication errors?
Another possible improvement is to define scope when requesting the authorization code. A scope is a domain of your application and can narrow down what you give access to like "read-email" or "make-posts" . Scopes are like Claims in Identity and can be added with ease to the JWT tokens. It is a good idea to define a scope if you have many clients that use your application differently so that all access tokens do not have the same access.
There are a lot of ways to attack OAuth, why the different security standards are continuously being updated. This is a rather simple approach to making an OAuth 2.0 server that uses Authorization Code flow. So, there will probably be some mistakes and there could be made more considerations towards limiting the generation of different tokens and codes and general monitoring to avoid abuse.
Conclusion
I have enhanced an application so that it can work as an authorization server according to the standard OAuth 2.0’s Authorization code flow. Then I showed how you can consume the access token that is received from the authorization server. In the end, I discussed why it can be a good idea to use a refresh token and other improvements that are recommended or optional for the flow. If you have any questions or feedback, then feel free to reach out.
Экспортировать неэкспортируемый сертификат с рутокена
Небольшая заметка как экспортировать неэкспортируемый ключ с Rutoken.
Внимательно читайте комменты
Если при создании ЭЦП не был установлен флаг дающий возможность экспортировать ключ, то при попытке скопировать ключ с Rutoken через КриптоПро у вас появится «Ошибка копирования контейнера. У вас нет разрешений на экспорт ключа, потому что при создании ключа не был установлен соответствующий флаг».
Но скопировать его все равно можно — для этого понадобится специальное ПО:
1. Утилита проверки Рутокенов версии 3.4.2
2. Сертфикс 1.1.27.3154
При помощи утилиты проверки Рутокенов версии 3.4.2 вы сможете экспортировать ключ с Рутокен на флешуку или реестр
После чего при помощи помощи Сертфикс 1.1.27.3154 вы сможете снять блокировку зажав клавишу Shift и кликнув по нужному сертификату правой кнопкой мыши выбрав пункт активации экспорта согласно вашему новому месту хранения выбранного в утилите проверки Рутокенов.
Важным моментом является то, что версия Сертфикс выше 1.1.27.3154 может быть программно ограничена на возможность сделать сертификат некоторых удостоверяющих центров экспортируемым.
Обновление программа проверяет при запуске, поэтому чтобы обновление не загрузилось необходимо заблокировать доступ в интернет для нее через брандмауэр Windows.
Token consumed что это в реестре
found a registry value called TOKEN_CONSUMED in HKCU(Computer\HKEY_CURRENT_USER)and its data is 1should i delete it or change it to 0this is the first time ive ever seen TOKEN_CONSUMED anywherei found out about it seeing how my network driver was corrupted and i happened to open HKCU(got an error message saying that some registry data for it was corrupted, i found the driver from getting the driver key in device manager but ive never seen any driver data in the registry so i just ended up doing a network reset lol)PLEASE FOR THE LOVE OF GOD DON’T GIVE ME A CANNED RESPONSE
Управляемые токенами реестры 1.0

Идея управляемых токенами реестров (TCR) зародилась в блокчейн-сообществе не менее года назад. По крайней мере, эта статья была опубликована автором еще в сентябре 2017 года. А недавно я был на конференции DappCon 2018 в Берлине и увидел большой интерес к этой теме, а также несколько ранних набросков на основе TCR. Поэтому предполагаю, что пик интереса еще впереди.
Мне TCR-контракты представляются крайне интересными, поскольку они являют собой пример наиболее простой замкнутой системы, управляемой децентрализованно и на основе экономических стимулов. Если немного пофантазировать, становится понятно, что на основе этой идеи можно децентрализовать очень многое, возможно даже всё в нашей социально-экономической жизни. И это уже не просто галлюцинации сумасшедших криптанов, а вполне неплохо сформулированный протокол. Более подробно читайте под катом.
Управляемые токенами реестры (token-curated registries, TCR) — это криптосистемы, которые всё шире применяются для решения различных задач. В этой статье мы представим более формальный взгляд на управляемые токенами реестры, но без математики.
В заголовке проставлена версия 1.0, потому что TCR и система стимулирования, описанные ниже, наверняка будут улучшены. Надеемся, этот документ станет отправной точкой для обсуждений, как улучшить TCR. Многие подобные реестры, развёртываемые сегодня, схожи, но применяют разные механики. Мы верим в «правильный» способ создания реестров, управляемых токенами, и в то, что возможно полностью переиспользовать устоявшуюся реализацию.
Применение реестров, управляемых токенами
Результат работы TCR — это список. У людей тяга к их составлению, и мы повсюду видим списки: покупок, «хороших» вузов, самых разыскиваемых преступников. Некоторые списки можно классифицировать как белые или чёрные. В любом случае содержимое списков удовлетворяет каким-то критериям (товары, которые нужно купить; вузы, чьи выпускники расплачиваются с долгами за учёбу в среднем за 10 лет; люди, за информацию о которых ФБР назначило награду более 100 000 долларов).
Полезные списки кто-то формирует. Список покупок обычно создаёт один человек. А за список лучших вузов, вероятно, отвечает комиссия. Если такой список сможет пополнять кто угодно, то скоро мы получим бесполезный перечень всех вузов, ведь любой ректор захочет, чтобы его заведение там упоминалось.
В TCR для назначения прав управления (curation rights) используются внутренние токены пропорционально их условному весу у субъектов — держателей токенов. Если есть компании, которые хотят попасть в список, то возникнет и рынок, где материальные интересы рациональных держателей токенов приведут к созданию качественного списка. TCR — это списки с децентрализованным управлением, они финансово стимулируют держателей токенов взвешенно формировать содержимое списков.
Точки зрения пользователей
Выделим три типа пользователей TCR: потребители, кандидаты, держатели токенов. У каждого типа — свои интересы, мотивы и способы взаимодействия с реестром. Потребители ищут качественные списки. Кандидаты стремятся туда попасть. Держатели токенов хотят повысить стоимость своих токенов.
Потребителям нужна качественная информация. Если школьник выбирает вуз на основании списка заведений, чьи выпускники расплачиваются с долгами за учёбу в среднем за 10 лет, то будет очень разочарован, обнаружив, что вуз ошибочно отнесли к такой категории.
Кандидаты желают добиться внимания потребителей. Вуз — участник списка (listee), допущенный в реестр, вероятно, получит больше заявок на поступление, чем если бы он не входил в список. Благодаря этому он сможет даже повысить оплату за обучение.
Держатели токенов хотят сохранить высокий спрос на токены, поскольку это увеличивает их стоимость. В противном случае держатели не будут заинтересованы в качественном содержимом управляемых ими списков. В примере с вузами держатели не должны быть ни потребителями реестра, ни кандидатами на включение в него. Чтобы спрос на токены не падал, держателям нужно сохранять высокое качество списков. Если реестр качественный, кандидаты захотят попасть в него, а потребители — ознакомиться с ним.
Держатели токенов, мастерски управляя списком, могут получить прибыль. Её размер зависит от качества управления и роста интереса потребителей и кандидатов.
Система стимулирования в TCR
Держатели токенов — это двигатель криптоэкономической игры, которая регулирует TCR. Чтобы реестр работал, кандидаты должны внести депозиты во внутренних токенах реестра, и тогда их заявки на включение в список рассмотрят. Если кандидат «хороший», он вносится в список, его депозит сохраняется. Решив покинуть список, участник может отозвать свой депозит. Если кандидат «плохой», держатели оспаривают его заявку, и после её отклонения депозит будет конфискован и поделён в качестве награды среди держателей токенов, которые участвовали в оспаривании. Кандидаты не будут подавать заявки в реестр, если не соответствуют его требованиям: это приведёт к финансовым потерям. Вуз, который не предлагает ничего путного и требует 50 000 долларов в год, вряд ли примут в реестр вузов, чьи выпускники расплачиваются с долгами за обучение в среднем за 10 лет, поэтому не стоит и пытаться. Держатели токенов могут увеличить свои накопления благодаря такому кандидату. Скорее всего, его заявку оспорят, но есть ненулевая вероятность, что заявку примут.
У держателей токенов есть тактический стимул отклонить каждого кандидата, чтобы увеличить свои накопления. Но это глупо, поскольку стратегическая задача — увеличить стоимость накоплений. Пустой список не нужен потребителям, поэтому кандидаты не будут стремиться в него. От кандидатов зависит фундаментальный спрос на внутренний токен реестра. Действуя тактически, а не стратегически, держатели токенов понесут серьёзные финансовые потери. В их интересах — достичь стратегической цели и создать качественный список.
Параметры TCR
Раздел можно использовать как справочник, поскольку в дальнейшем мы не раз упомянем перечисленные здесь параметры. Мы будем называть их снимками (snapshot) параметров и текущими обязательными (current canonical) параметрами. Снимок фиксирует значения текущих обязательных параметров в некий момент времени, они «застывают» в снимке и не меняются, даже если текущие обязательные параметры изменились. Если не указано иное, упомянутый в тексте параметр — это именно текущий обязательный параметр.
MIN_DEPOSIT
Столько токенов кандидат должен внести в качестве депозита за принятие в список и нахождение в нём.
APPLY_STAGE_LEN
За это время включение кандидата в список можно оспорить. Измеряется в блоках или эпохах. Если оспаривания не было, кандидат попадает в список.
COMMIT_PERIOD_LEN
За это время держатели токенов могут проголосовать за оспаривание. Измеряется в блоках или эпохах.
REVEAL_PERIOD_LEN
За это время держатели токенов могут огласить голоса за конкретное оспаривание. Измеряется в блоках или эпохах.
DISPENSATION_PCT
Доля конфискованного депозита, которая присуждается победителю в качестве особого разрешения (special dispensation), компенсирующего финансовые риски.
VOTE_QUORUM
Обнародованная доля общего количества токенов, необходимая для того, чтобы оспоренный кандидат попал в список / оспоренный участник остался в списке. VOTE_QUORUM не подсчитывает токены, которые не голосовали, а необнародованные токены считаются неголосовавшими. К примеру, VOTE_QUORUM 50 означает, что все оспаривания решаются простым большинством.
Позиции (listings)
Позиция — элемент из единого набора перечисленных в списке элементов, которые содержатся в TCR. В примере с вузами позиция может быть простым строковым значением, идентифицирующим вуз по его хорошо известному названию, например Foo University. Выбирая форму позиции, помните, что она будет аутентифицировать реальный объект. В случае с вузами достаточно взять их названия, поскольку подделка физической и социальной организации перечисленных в списке вузов ради обмана потребителей потребует слишком серьёзных усилий (фальшивые кампусы, персонал, удостоверения и т. д.).
Средства аутентификации, насколько это возможно, оставляйте на усмотрение пользователей. Скажем, пользователи реестра доменных имён могут аутентифицировать свои подключения к доменам с помощью сертификата HTTPS, сети доверия (web-of-trust) или хешированных секретных значений, которые хранятся в метаданных списка и предоставляются в качестве подтверждения от оракула. Важно, чтобы участники списка и потребители де-факто приняли как минимум одно средство аутентификации, поддерживаемое обеими сторонами, в противном случае реестр будет бесполезен.
Подача заявки
Когда кандидат на включение в список TCR подаёт заявку, он должен внести депозит во внутренних токенах реестра. Минимальный размер — MIN_DEPOSIT , столько токенов будет выставлено в качестве депозита при оспаривании заявки. Заявка будет рассмотрена (resolved) спустя APPLY_STAGE_LEN . Если за это время заявку никто не оспорил, кандидат становится участником списка. В противном случае статус кандидата определяется по результатам оспаривания.
Заявка содержит снимок текущих обязательных параметров, и все действия с заявкой ссылаются на её зафиксированные в снимке параметры.
Оспаривание заявки
Оспаривание инициируется применительно либо к кандидатам, которые ожидают рассмотрения заявки, либо к участникам списка. Допускается лишь одно активное оспаривание по отношению к каждому кандидату или участнику. Инициатор оспаривания выставляет депозит в размере MIN_DEPOSIT против позиции списка или заявки, чей депозит превышает MIN_DEPOSIT либо равняется ему. (Об оспаривании позиций с депозитом меньше MIN_DEPOSIT мы поговорим в разделе «Краевая ситуация: touch-and-remove».)
Когда оспаривание инициировано, создаётся снимок текущих обязательных параметров реестра и начинается голосование (см. раздел «Голосование»), в котором может участвовать любой держатель токенов. После голосования конфискуется депозит либо кандидата, либо инициатора оспаривания. Победившая сторона получает часть конфискованного депозита ( DISPENSATION_PCT ) в качестве компенсации за финансовый риск. Оставшаяся часть депозита распределяется между участниками голосовавшего большинства в соответствии с весом их токенов. Участники голосовавшего меньшинства ничего не теряют и не получают.
Примечание. DISPENSATION_PCT , по существу, даёт инициатору оспаривания уверенность в возможности выиграть голосование. В результате выигрыша фактически произойдёт публикация (issue) оспаривания. Если особое разрешение (special dispensation) определено, например, на уровне 50 %, то оспаривающий должен быть более чем на 66 % уверен в возможности победы. Почему 66 %? Потому что существует 33%-я вероятность полностью потерять депозит и 66%-я вероятность заработать половину депозита: (0,33)(–1) + (0,66)(0,5) = 0.
Если оспорена заявка, то она удаляется, а кандидат может стать или не стать участником списка. Если оспорена позиция списка, то позиция может быть удалена или не удалена.
Краевая ситуация: touch-and-remove
Если кандидат внёс депозит, стал участником, а позже значение текущего обязательного MIN_DEPOSIT увеличилось, то депозит участника окажется меньше MIN_DEPOSIT . Если оспорена такая позиция, она немедленно убирается из списка, а депозиты оспаривающего и участника списка возвращаются владельцам. Это и есть touch-and-remove.
Почему и зачем нужен такой подход? Примем, что размеры депозитов при оспариваниях должны быть одинаковыми, чтобы на действия голосующих не влияло желание поделить самый большой депозит (это даст им наибольшую прибыль). Тогда почему бы нам не приравнять размеры депозитов при оспариваниях к размерам депозитов самих оспариваемых позиций? Возможна ситуация, когда депозит из-за колебаний рыночной цены токена стал дешевле газа и альтернативных издержек (opportunity cost). Участники понесут эти издержки, если инициируют оспаривание или поучаствуют в голосовании. Подход touch-and-remove снижает возможность отравить реестр записями, чьи депозиты слишком малы для оспаривания: активные держатели токенов просто удалят такие позиции с минимальными затратами.
Чтобы защититься от touch-and-remove после повышения MIN_DEPOSIT , участники списка могут сколько угодно увеличивать свои депозиты, причём любой объём сверх обязательного MIN_DEPOSIT можно в любое время отозвать. При оспаривании размер текущего MIN_DEPOSIT фиксируется в снимке, и только это количество разрешается поставить на кон.
Голосование
Голосование в TCR должно быть token-weighted и проходить по схеме commit-reveal. Иных особых требований к голосованию нет, главное, чтобы механизм был эффективен с точки зрения ликвидности токенов.
Характеристика token-weighted (условный вес токенов) важна для держателей, которые вложили больше всего токенов, а значит, их голос при управлении реестром наиболее весомый. Такие держатели будут самыми осмотрительными. А благодаря схеме commit-reveal голосование стимулирует участников исключительно к наибольшей продуктивности. Ликвидность токенов нужно максимизировать, чтобы поощрять участников голосовать.
PLCR-голосование (Partial Lock Commit Reveal Voting) — самый эффективный механизм голосования на основе токенов для TCR.
Параметризация
Параметры реестра должны адаптироваться к динамике изменения рыночной цены внутреннего токена реестра. Например, цена падает, появляются сотни кандидатов на включение в реестр, и держатели токенов не могут эффективно обработать все заявки. Тогда нужно увеличить MIN_DEPOSIT .
Пока нет однозначного ответа, как лучше всего выполнять параметризацию, т. е., по сути, управлять реестром. К примеру, в AdChain принципы параметризации те же, что и принципы обработки заявок на включение в реестр. Здесь используется другой набор тех же параметров, поэтому для предложения о репараметризации MIN_DEPOSIT может быть куда более высоким, чем если бы речь шла о включении новой позиции. Предложения о репараметризации тоже оспариваются с помощью токен-депозитов, их размещают и предлагающий, и оспаривающий. Держатели токенов могут голосовать за репараметризацию параметров реестра или параметров самого репараметризатора.
Интересные свойства TCR
Внутренние токены реестров — необходимый элемент самодостаточных систем для публичного использования. Сами TCR — главные враги капитализма, они выполняют полезную функцию при минимально возможных маржинальных издержках.
Управляемые токенами реестры удовлетворяют принципам Mike’s Cryptosystems Manifesto
Для TCR нужны внутренние токены. Использование чего-либо другого вместо них нарушит нормальную работу системы. Держатели токенов должны понимать плюсы и минусы своей хорошей или плохой работы, тогда у них появится мотивация для основной задачи — управления реестром. К примеру, на цену биткоина не повлияет снижение спроса на него в списках реестров. Значит, держатели захотят собрать с кандидатов как можно больше биткоинов с помощью ложных оспариваний и сговоров на голосованиях, отодвинув интересы управления реестром на второй план. А если единственное назначение токена — использование при подаче заявок в реестр, его цена будет меняться в зависимости от спроса на участие в списках. На спрос влияет то, насколько качественно держатели управляют списками. Принцип необходимости токена (token-necessity) в TCR соблюдён.
Система самодостаточна, если она нормально функционирует без участия своих создателей. В TCR ни у одной записи нет особых привилегий. Все токены равноценны, и лишь вес токена определяет вес привилегий его держателя в реестре. Создатель реестра может исчезнуть, а замкнутая система стимулирования от этого никак не пострадает. TCR — настоящие децентрализованные системы. Принцип самодостаточности соблюдён.
Система публично используема (public utility), если она не требует разрешений, свободна от арендной платы и приносит пользу. TCR не требуют разрешений, полностью децентрализованы, а привилегии в них определяются лишь условным весом токенов. Такие реестры не требуют арендной платы, поскольку никогда не будут поставлены на кон ради стимулирования кого-то выполнить задачу или удержания от атаки. TCR генерируют полезный результат в виде списков. Принцип публичного использования соблюдён.
Главные враги капитализма
Системы, создающие полезный результат при минимальных маржинальных издержках, — это и есть главные враги капитализма. Результат работы TCR бесплатен: списки хранятся в блокчейне, любая сторона может их считать. Вместо того чтобы отдавать деньги вендору за составление списка, потребители TCR бесплатно получают продукт всех вендоров. Те соперничают друг с другом в создании лучшего списка, какой только может появиться на свободном рынке.
Желающие улучшить качество TCR могут купить токены по рыночной цене, качественно управлять реестром, подогреть интерес потребителей, увеличить спрос кандидатов на токен — а затем продать свои токены, заработав на тех, кто хочет улучшить реестр. Держатель токена, который хорошо умеет выдвигать оспаривания и голосовать, обеспечит себе постоянный доход, продавая полученные от конфискованных депозитов токены и не теряя основной капитал.
Таким образом, на эффективном рынке внутренние токены реестров со временем оптимально распределятся среди субъектов, которые используют их наиболее продуктивно. В TCR прибыльность и продуктивность тесно взаимосвязаны.
Атаки и защита от них
TCR теоретически возможно атаковать. Кроме того, наверняка ещё не все разновидности атак сформулированы и зафиксированы. Ниже мы обсудим известные атаки и защиту от них.
Простой троллинг
Тролль пытается добавить в «хороший» реестр «плохие» позиции, которые не удовлетворяют критериям реестра. Если за реестром хорошо следят, такие атаки дороги и неэффективны: тролль теряет депозит, когда рациональный держатель токенов успешно оспаривает заявку. Чтобы преодолеть рациональность голосующих, простая троллинг-атака должна превратиться в атаку сумасшедшего.
Атака сумасшедшего
У обеспеченного ресурсами злоумышленника могут быть рациональные причины потратить много средств на уничтожение реестра. Если полезный список при почти нулевых маржинальных затратах разрушает бизнесы, то пострадавшим компаниям это наверняка не понравится. Злоумышленник скупит по рыночной цене большинство защищённых от оспаривания токенов с правом голоса и заполнит реестр низкокачественными позициями. Реестр будет испорчен, стоимость токенов обрушится.
К счастью, управляемые токенами реестры имеют свойства защиты от подобных атак, довольно похожие на те, что характерны для Casper. С точки зрения финансов при атаке 51 % оружие злоумышленников можно уничтожить с помощью хардфорка. Как говорит Виталик, «задача в том, чтобы сделать атаку 51 % крайне дорогой, чтобы даже большинство совместно работающих валидаторов не могли откатить финализированные блоки без крайне тяжёлых финансовых потерь. Настолько тяжёлых, что даже успешная атака наверняка приведёт к увеличению цены на базовую валюту, поскольку на сокращение общего предложения монет рынок будет реагировать сильнее, чем на экстренный хардфорк для ослабления атаки». В TCR валидаторы — это держатели токенов.
Вероятно, на практике в любое время лишь меньшая часть токенов будет активно участвовать в голосовании (см. раздел «Bootstrapping»), поэтому атаки сумасшедшего окажутся не столь дороги, как подразумевает ярлык «атака на большинство валидаторов». Уменьшение пассивности держателей токенов — важный открытый вопрос в TCR.
Отравление реестра (registry poisoning)
Отравлением реестра занимается не держатель токена, а участник списка. В реестр вносится позиция, а после её качество ухудшается. Например, вуз, включённый в список высококачественных учебных заведений, благодаря этому повышает стоимость обучения, но его выпускники позднее обнаруживают, что не могут расплатиться с долгами за обучение через 10 лет.
Рациональные держатели токенов должны выявлять такое поведение и оспаривать позиции, отравляющие реестр. Малоизученный аспект: отравление может быть относительно дешёвым, если позиция списка только ждёт, пока MIN_DEPOSIT увеличится во время действия списка, а если неправомерные действия обнаружат — то можно покинуть список по процедуре touch-and-remove. В этом случае позиция списка не теряет депозита, однако сам субъект теряет репутацию и больше не вернётся в список.
Бросание монеты и мемизация голосования
Голосующих не наказывают за плохие решения, поэтому держатели токенов могут обнаружить, что проще «бросать монету», чем тратить время на взвешенные оценки. Защититься от атаки можно при долгосрочной заинтересованности голосующих в максимизации спроса на токен. Но неизвестно, в какой мере эти соображения повлияют на возникновение критической массы голосующих, нивелирующих безответственное поведение других.
Бросание монеты — атака не слишком опасная: предположив равномерное распределение голосов в результате бросания монеты, немногочисленные активисты — держатели токенов при любом оспаривании склонят чашу весов в пользу рациональности.
Мемизация голосования (vote memeing) происходит, когда участники голосуют лишь ради того, чтобы оказаться в большинстве. С точки зрения мотивации аналогично бросанию монеты, но результат хуже: меньшинство активистов — держателей токенов не склонит чашу весов в пользу рациональности.
Бросание монеты и мемизация голосования — комплексные атаки, потому что они нацелены на пределы рациональности держателей токенов (см. «Пределы рациональности»).
Открытые вопросы
Пределы рациональности
Бывают стратегии, рациональные «здесь и сейчас», но вредные в долгосрочной перспективе. Пассивное держание токенов само по себе нежелательно, бросание монеты и мемизация голосования рациональны, но со временем ухудшают качество реестра. Каких оптимальных стратегий будут придерживаться участники? Может ли возникнуть ситуация, когда кто-то действует тактически, а кто-то стратегически, и в результате качество списков окажется средненьким, ниже, чем если бы список управлялся централизованно?
Bootstrapping
TCR свойственна дилемма первичности курицы и яйца. Потребителей не привлекает пустой список, а кандидаты не хотят участвовать в списке, который неинтересен потребителям. В целом реестру трудно будет обрести интерес любой из групп участников, чтобы достичь устойчивого самодостаточного состояния. Есть разные мнения об оптимальном подходе к созданию управляемого токеном реестра, и пока ни один из подходов не превратился в чёткий паттерн, которому нужно следовать.
Один подход: группа кандидатов в сотрудничестве с «устаревшими» руководящими органами (отраслевыми лобби, консультативными советами) формирует начальный набор участников. Мотивация: использовать проверенных отраслевых кураторов для создания убедительного базового набора позиций в реестре.
Другой подход: первоначально токены реестра распределяются среди потенциальных потребителей и кандидатов. Это даёт сторонам (в противном случае незаинтересованным) осязаемую мотивацию для самостоятельного взращивания системы.
Минимальный размер экономики
Каков минимальный размер экономики, необходимой для децентрализованного управления списком? Выгодно ли экономически децентрализованно управлять списком покупок? Будет ли рационально для производителя фасованных товаров и продуктов подавать заявки на включение в реестр позиций, которые необходимо приобретать в продуктовом магазине? Смогут ли голосующие управлять списком, который полезен для покупателей? Откуда голосующим узнать, достаточно ли покупателю сыра? Какой минимальный интерес потребителей нужен для децентрализованного управления списком?
Параметризация
Параметризация реестров на сегодняшний день не проработана хорошо. Возможно, тот же параметризатор AdChain можно довести до постоянной нестабильности. К примеру, задав нулевое значение для MIN_DEPOSIT параметризатора. Тогда тролли без особых усилий неограниченное время станут сохранять нулевое значение MIN_DEPOSIT , поскольку после успешной первоначальной атаки можно создать множество предложений, которые позднее будут обработаны и активированы в любое время. Защита от подобной атаки на параметризатор AdChain зависит от осмотрительности держателей токенов. Реестры оправятся от последствий недосмотра держателей и отравлений средствами оспаривания, но параметризаторы могут быть безвозвратно повреждены даже после одной успешной атаки.
Token consumed что это в реестре
КриптоПро один из наиболее широко используемых криптопровайдеров на территории Российской Федерации, он широко используется в системах электронного документооборота, сдачи отчетности и взаимодействия с государственными органами, поэтому встретить его можно практически в любой организации. По этой причине у системных администраторов часто встает вопрос его переноса на другой ПК. А так как криптография является для многих сложной и непонятной областью, то эта простая задача может вызвать некоторые затруднения.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Если вы ранее не сталкивались с криптографией вообще, то рекомендуем прочитать нашу статью: Введение в криптографию. Общие вопросы, проблемы и решения. Здесь мы не будем углубляться в теорию, но приведем некоторый необходимый ликбез.
В повседневной деятельности широко распространено понятие «сертификат», им оперируют все, от сотрудников удостоверяющих центров, то бухгалтеров, работающих с ЭЦП. Часто можно услышать что-то подобное: «нам купили в бухгалтерию новый компьютер, нужно перенести сертификаты». Но если подходить с точки зрения криптографии, то слово «сертификат» в данном случае употребляется неправильно. Вся современная криптография строится вокруг инфраструктуры открытых ключей (PKI), которая подразумевает наличие у каждого участника ключевой пары: открытого и закрытого ключа.
Закрытый ключ является секретным, с его помощью мы можем подписывать документы, шифровать информацию и т.д. и т.п. Закрытый ключ Усиленной квалифицированной электронной подписи (УКЭП) равнозначен нотариально заверенной подписи и его попадание в чужие руки может привести к самым тяжелым последствиям.
Открытый ключ, дополненный некоторыми дополнительными данными, выпускается в форме сертификата и является публично доступным, с его помощью можно проверить действительность цифровой подписи, выполненной закрытым ключом или убедиться в подлинности участника обмена электронными документами.
Поэтому, когда мы говорим о переносе «сертификатов», то подразумеваем необходимость перенести ключевую пару: закрытый ключ и сертификат, перенос одних только сертификатов не принесет успеха, криптография на новом узле работать не будет.
Выяснив этот момент, перейдем к хранилищам закрытых ключей. КриптоПро предполагает в таком качестве токены, флеш-накопители и системный реестр. Токены являются наиболее защищенными устройствами, извлечь закрытый ключ из них невозможно, и вы можете не опасаться несанкционированного копирования (для этого закрытый ключ должен быть помечен как неэкспортируемый). Флеш-накопители представляют некий компромисс между безопасностью и мобильностью, а реестр удобен в тех случаях, когда на одном ПК нужно одновременно работать с большим количеством ключей. И именно с ним связаны определенные сложности при переносе на другой узел.
Экспорт ключей и сертификатов
Для того, чтобы правильно экспортировать закрытые ключи, нам нужно выяснить идентификатор безопасности ( SID) текущего пользователя (который работает с ЭЦП), это можно сделать командной:
![]()
Затем откроем редактор реестра и перейдем в ветку для 32-битных систем:
для 64-битных систем:
Найдем и раскроем раздел с SID текущего пользователя и экспортируем оттуда ветку Keys.
![]()
Обратите внимание, что данная ветка содержит закрытые ключи, поэтому следует принять все меры безопасности и не передавать файл экспорта по открытым каналам связи и вообще исключить к нему несанкционированный доступ посторонних лиц.
После чего скопируем все сертификаты, расположенные по пути
Это открытые ключи, никакой секретности они не представляют, поэтому просто копируем их любым доступным способом.
Импорт ключей и сертификатов
Прежде всего установим на новый узел КриптоПро, обратите внимание, что переносить ключи и сертификаты следует между одинаковыми версиями. В противном случае либо обновите версию КриптоПро на старой системе, либо установите старую версию на новой и обновите ее уже после переноса ключевых пар.
Затем снова узнаем SID пользователя, который будет работать с ЭЦП, если это текущий пользователь, то снова выполните:
В противном случае:
где Name — имя пользователя.
После чего откройте на редактирование файл реестра с экспортированными закрытыми ключами и замените в нем все вхождения старого SID на SID нового пользователя.
![]()
Сохраните файл и импортируйте его в реестр. Закрытые ключи перенесены, файл переноса в целях безопасности следует удалить.
Следующим шагом скопируйте сохраненные сертификаты в
После чего можно устанавливать и настраивать приложения работающие с криптографией, все будет работать.
Как быть если доступ к старой системе невозможен?
Теория — это хорошо, но практика может подкинуть самые неожиданные ситуации. Как быть, если доступ к старой системе невозможен? Скажем вышла из строя материнская плата или серьезно повреждена операционная система?
Все что нам нужно в таком случае — это доступ к файловой системе старой системы. Вы можете как напрямую подключить жесткий диск к новой системе, так и загрузиться при помощи консоли восстановления или любого более продвинутого инструмента, скажем MSDaRT.
С копированием сертификатов проблемы возникнуть не должно, их хранилище простая папка на диске, а вот с хранилищем закрытых ключей в реестре немного сложнее. Но не будем забывать, что системный реестр тоже хранится в файлах на диске. Вам следует любым доступным образом скопировать файл SOFTWARE из C:\Windows\System32\config
![]()
Затем на целевой системе откройте редактор реестра, перейдите в раздел HKEY_LOCAL_MACHINE и через Файл — Загрузить куст подключите скопированный из старой системы раздел реестра. Дайте ему осмысленное имя, скажем OLD_SOFTWARE.
![]()
После чего пройдите в раздел с закрытыми ключами (с учетом новой точки монтирования) и выполните экспорт ветки Keys.
![]()
Дальнейшие действия ничем не отличаются от описанных нами в разделе Импорт ключей и сертификатов.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Помогла статья? Поддержи автора и новые статьи будут выходить чаще:
![]()
Или подпишись на наш Телеграм-канал: ![]()
Перенос сертификатов КриптоПРО на другой компьютер, за минуту
…. Захотелось с вами поделиться опытом, о массовом переносе контейнеров с закрытыми ключами, находящимися в области реестра Windows. Использовать мы будем как КриптоПРО, так и встроенные механизмы. Уверен будет интересно.
Когда нужно переносить сертификаты в другое место?
И так давайте рассмотрим по каким причинам у вас может появиться необходимость в копировании ваших ЭЦП в другое место.
- На текущем физическом компьютере начинает умирать жесткий диск или SSD накопитель (Как проверить жизненные показатели жесткого диска), очень частая история и жизненная, когда люди теряли все свои данные, из-за банальной жадности в покупке нового оборудования и элементарного незнания принципов резервного копирования.
- У вас производится модернизация оборудования, его улучшение и вам нужно перенести все сертификаты с закрытыми ключами на другую систему
- Вы создали отдельный сервер, в виде виртуальной машины, где будут находится все ваши сертификаты и с ними смогут работать все необходимые сотрудники, терминал для бухгалтерии. Простой пример СБИС, и когда у вас 10-20 организаций.
Как видите предпосылок и вариантов переноса сертификатов из реестра на другой компьютер, предостаточно.
Какие есть варианты по копированию контейнеров закрытых ключей?
- Если мы создаем единый терминал (Виртуальную машину), на которой будут коллективно работать пользователи, то можно произвести конвертирование физической тачки в виртуальную машину
- Если будет просто замена жесткого диска, то можно произвести его клонирование или перенос системы на SSD с помощью специальных утилит
- Можно воспользоваться утилитой КриптоПРО
- Воспользоваться экспортом из реестра Windows.
Перенос сертификатов в виде пошаговой инструкции
Первые два пункта я описывать тут не стану, так как я уже это подробно рассказывал, посмотрите по ссылкам. Я расскажу, об остальных методах и начнем мы с классического КриптоПРО.
Данный метод подойдет для тех ситуаций, когда у вас один или 2 сертификата (ЭЦП). Если же их несколько десятков, а это не такая уж и редкость, то такой путь вам не подходит, и там придется выбирать 4-й метод.
Важное замечание. Я буду переносить контейнеры закрытого ключа , которые хранятся в реестре. Если вы храните их только на токене, то переносить контейнеры вам не надо, только сертификаты
Копирование закрытого ключа из КриптоПро
Это самый простой способ, и будет актуальным при небольшом количестве контейнеров с закрытыми ключами. Чтобы выполнить перенос сертификатов из реестра, откройте ваш КриптоПРО, вкладка «Сервис», нажимаем кнопку «Сервис», далее через кнопку «Обзор», откройте «Выбор ключевого контейнера» и укажите, какой сертификат вы будите переносить. В моем примере это контейнер «Копия сертификата в реестре (Семин Иван)».

Нажимаем «Далее», вас попросят задать новое имя контейнера с закрытым ключом, введите понятное для себя, для удобства.

У вас откроется окно с выбором носителей, вы можете выбрать либо токен, либо флешку для переноса на другое место. У меня это внешний жесткий диск Z:\.

Задаем обязательно пароль, с точки зрения безопасности, так как файлы в таком виде просто скомпрометировать.

Все, на выходе я получил папку со случайным названием и набором ключей в формате key.


Связана такая ситуация, что в целях псевдобезопасности, удостоверяющие центры выпускают закрытые ключи без возможности экспорта, и таким образом увеличивают свою прибыль, так как в случае утери или поломки токена, вам придется его перевыпускать, а так как экспорт запрещен, то бэкапа вы сделать не сможете.
Если вы получили ошибку копирования контейнера. У вас нет разрешений на экспорт ключа, то метод с КРиптоПРО вам не поможет
Перенос сертификатов из реестра без КриптоПРО
Существуют методы экспортировать закрытый ключ и без использования утилиты КриптоПРО. Представим себе ситуацию, что у вас на него кончилась лицензия и вы не успели ее купить. Вам нужно сдать отчетность в СБИС. Вы развернули CryptoPRO на другом компьютере, так как он позволяет 3 месяца бесплатного использования, осталось для СБИС выполнить перенос сертификатов, которые у вас в реестре Windows.
У нас два варианта:
- Использование оснастки mmc-Сертификаты пользователя.
- Использование Internet Explore
Откройте там контейнер «Личное — Сертификаты». Если у вас в контейнере не один сертификат с одинаковым именем, такое может быть, то откройте сертификат в оснастке mmc и в КриптоПРО и сравните серийные номера сертификата.

В Internet Explore, откройте «Свойства браузера — Содержание — Сертификаты»

Теперь нам необходимо его экспортировать, в оснастке «Сертификаты», через правый клик, это можно сделать, в Internet Explorer, сразу видно кнопку, экспорт.

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

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

Следующим этапом в мастере экспорта сертификатов, вам необходимо выбрать формат выгрузки, это будет PFX архив.

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

Мастер экспорта сертификатов, выведет вам сводные данные, нажимаем «Готово».

Отрываем локацию, куда вы его выгрузили, и найдите свой pfx архив.

Теперь вам нужно еще выгрузить открытый ключ в формате cer, для этого так же зайдите в мастер экспорта, но на этот раз выберите «Нет, не экспортировать закрытый ключ».

Выберите формат файла «X.509 (.CER) в кодировке DEP», задайте ему имя и место сохранения. На выходе у вас появятся два файла.

Одни открытый ключ в формате cer и закрытый ключ в формате pfx. Этого набора вам будет достаточно, чтобы перенести сертификаты СБИС, Контура и остальных программ на другой компьютер.

Теперь перенесите эти файлы на другое рабочее место и просто запустите, через простой двойной клик. У вас откроется мастер импорта сертификатов, на первом окне выберите нужное вам хранилище, я в своем примере оставлю «Текущий пользователь».

На втором шаге проверяем импортируемый сертификат.

Указываем пароль, который задавали при выгрузке.

Оставляем автоматический выбор хранилища на основе типа сертификатов.

Готово. Со вторым файлом то же самое. После чего у вас будут перенесены нужные вам ключи и сам сертификат, можно работать.
Массовый перенос ключей и сертификатов CryptoPro на другой компьютер
Выше описанные методы хороши, когда у вас один или 5 ключиков в реестре, а как быть если их десятки. Помню лет 5 назад, когда я еще был младшим администратором, то я очень часто устанавливал электронные цифровые подписи главбуху, так как она работала в СБИС++ и сдавала там постоянно отчетность по огромному количеству организаций, по типу рога и копыта. Держать кучу токенов было не вариант, и для таких вещей у нее все хранилось в реестре и копия сертификатов была на флешке в сейфе. Флешку потом потеряли, встал вопрос сделать резервную копию всего и плюс обновить систему, в виду нового компьютера, на операционной системе Windows 8.1. ЭЦП было штук 50, а так как я ценю свое время, то и искал методы, выполнить это быстрее, к счастью я его нашел.
Заключался метод переноса сертификатов из реестра, в выгрузке веток и подмене SID значения, но обо всем по порядку. О том, как посмотреть SID пользователя и что это такое я рассказывал.
Открываете командную строку cmd и вводите команду:

Вот это S-1-5-21-551888299-3078463796-888888888-46162 и есть SID, вашей учетной записи. Теперь когда вы его знаете, то вам нужно выгрузить ваши закрытые ключи из реестра Windows. Для этого откройте вот такую ветку:

В контейнере Keys, вы найдете все ваши закрытые ключи от ЭЦП. С правой стороны вы увидите файлы:
* header.key
* masks.key
* masks2.key
* name.key
* primary.key
* primary2.key
Щелкаем правым кликом по контейнеру Keys и экспортируем его.

Сохраняем нашу ветку реестра с контейнерами закрытых ключей. Далее нам нужно скопировать открытые ключи, которые лежат по пути:
Не забывайте только подставить своего пользователя, эта папка может быть скрытой, поэтому включите скрытые папки и файлы в вашей ОС. Все содержимое этой папки вам нужно перенести на другой компьютер, только уже в папку другого, нужного пользователя.

Как только вы поместили на новом компьютере папку Key, вы можете перенести реестровую выгрузку. Сохраненный файл в формате reg, вы должны открыть в любом текстовом редакторе.

Как я показывал выше, определите SID нового пользователя, скопируйте его полностью и замените им значение в файле reg, я отметил это стрелками.

Все сохраняйте файл и запускайте его, у вас будет начат перенос сертификатов (закрытых ключей), подтверждаем действие.

Как видите импорт успешно завершен. Все теперь ваши закрытые и открытые ключи на месте и вы можете работать с вашими ЭЦП, и можно считать, что перенос сертификатов с одного компьютера на другой в массовом масштабе, осуществлен успешно.
Копирование закрытого ключа
Мне постоянно приходится иметь дело с сертификатами, токенами, закрытыми ключами, криптопровайдерами и прочим. Сейчас все завязано на это — банкинг, сдача отчетности в разные гос органы, обращения опять же в эти органы, в том числе и физ лиц. В общем, с этой темой рано или поздно придется познакомиться многим. Для того, чтобы перенести все это хозяйство с одного компьютера на другой, иногда приходится прилично повозиться, особенно тем, кто не в теме. Перенести закрытые ключи и сертификаты КриптоПро на другой компьютер можно двумя способами:
- Перенести или скопировать контейнер закрытого ключа через стандартную оснастку CryptoPro в панели управления. Это самый простой и быстрый способ, если у вас не много сертификатов и ключей. Если же их несколько десятков, а это не такая уж и редкость, то такой путь вам не подходит.
- Скопировать сертификаты и ключи непосредственно через перенос самих исходных файлов и данных, где все это хранится. Объем работы одинаков и для 5 и для 50-ти сертификатов, но требуется больше усилий и знаний.
Я опишу оба этих способа, но подробно остановлюсь именно на втором способе. В некоторых ситуациях он является единственно возможным.Важное замечание. Я буду переносить контейнеры закрытого ключа, которые хранятся в реестре. Если вы храните их только на токене, то переносить контейнеры вам не надо, только сертификаты.
Копирование закрытого ключа через оснастку КриптоПро
Для того, чтобы скопировать контейнер для хранения закрытого ключа сертификата штатным средством, необходимо в Панели управления открыть оснастку CryptoPro, перейти в раздел Сервис и нажать Скопировать.

Далее вы выбираете текущий контейнер, который хотите скопировать. Это может быть либо токен, либо реестр компьютера. Затем новое имя и новое расположение контейнера. Опять же, это может быть как реестр, так и другой токен.

Ошибка копирования контейнера

Но тут есть важный нюанс. Если во время создания закрытого ключа он не был помечен как экспортируемый, скопировать его не получится. У вас будет ошибка:

Ошибка копирования контейнера. У вас нет разрешений на экспорт ключа, потому что при создании ключа не был установлен соответствующий флаг. Ошибка 0x8009000B (-2146893813) Ключ не может быть использован в указанном состоянии. Либо вы просто не сможете его выбрать для копирования, если у вас последняя версия CryptoPro. Он будет неактивен:

Если получили такую ошибку, то для вас этот способ переноса не подходит. Можно сразу переходить к следующему. Отдельно расскажу, как скопировать сертификат и закрытый ключ к нему в файл, чтобы перенести на другой компьютер без использования токена. Делаем это там же на вкладке Сервис в оснастке CryptoPro. Нажимаем Посмотреть сертификаты в контейнере.

Выбираем необходимый сертификат и нажимаем Посмотреть свойства сертификата.

Далее переходим на вкладку Состав в информации о сертификате и нажимаем Копировать в файл.

Если у вас после слов «Экспортировать закрытый ключ вместе с сертификатом» нет возможности выбрать ответ «Да, экспортировать закрытый ключ«, значит он не помечен как экспортируемый и перенести его таким способом не получится. Можно сразу переходить к другому способу, который описан ниже.

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

Укажите какой-нибудь пароль и запомните его! Без пароля продолжить нельзя. В завершении укажите имя файла, куда вы хотите сохранить закрытый ключ. Теперь вам нужно скопировать сам сертификат. Только что мы копировали закрытый ключ для него. Не путайте эти понятия, это разные вещи. Опять выбираете этот же сертификат в списке из оснастки Crypto Pro, жмёте Копировать в файл, экспортировать БЕЗ закрытого ключа. И выбираете файл формата .CER.

Сохраните сертификат для удобства в ту же папку, куда сохранили закрытый ключ от него. В итоге у вас должны получиться 2 файла с расширениями:
- .pfx
- .cer
Вам достаточно перенести эти 2 файла на другой компьютер и кликнуть по каждому 2 раза мышкой. Откроется мастер по установке сертификатов. Вам нужно будет выбрать все параметры по умолчанию и понажимать Далее. Сертификат и контейнер закрытого ключа к нему будут перенесены на другой компьютер. Я описал первый способ переноса в ручном режиме. Им можно воспользоваться, если у вас немного сертификатов и ключей. Если их много и руками по одному переносить долго, то переходим ко второму способу.
Массовый перенос ключей и сертификатов CryptoPro с компьютера на компьютер
В интернете достаточно легко находится способ переноса контейнеров закрытых ключей КриптоПро через копирование нужной ветки реестра, где это все хранится. Я воспользуюсь именно этим способом. А вот с массовым переносом самих сертификатов у меня возникли затруднения и я не сразу нашел рабочий способ. Расскажу о нем тоже. Для дальнейшей работы нам надо узнать SID текущего пользователя, у которого мы будем копировать или переносить сертификаты с ключами. Для этого в командной строке выполните команду:

В данном случай user — имя учетной записи, для которой узнаем SID. Далее скопируем контейнеры закрытых ключей в файл. Для этого на компьютере открываем редактор реестра (regedit.exe) и переходим в ветку:
где S-1-5-21-4126888996-1677807805-1843639151-1000 — SID пользователя, у которого копируем сертификаты. Выбираем папку Keys и экспортируем ее. Этот путь актуален для 64-х битных систем — Windows 7, 8, 10. В 32-х битных путь может быть немного другой. Я специально не проверял, но поиском по реестру вы при желании найдете его.

Сохраняем ветку реестра в файл. В ней хранятся закрытые ключи. Теперь нам нужно скопировать сразу все сертификаты. В Windows 7, 8 и 10 они живут в директории — C:\Users\user\AppData\Roaming\Microsoft\SystemCertificates\My. Сохраняйте эту директорию. Для переноса ключей и сертификатов нам надо скопировать на другой компьютер сохраненную ветку реестра и директорию с сертификатами My.
После того, как перенесли файлы со старого компьютера на новый, открываем файл с веткой реестра в текстовом редакторе и меняем там SID пользователя со старого компьютера на SID пользователя нового компьютера. Можно прям в блокноте это сделать поиском с заменой.

После этого запускаем .reg файл и вносим данные из файла в реестр. Теперь скопируйте папку My с сертификатами в то же место в профиле нового пользователя. На этом перенос сертификатов и контейнеров закрытых ключей КриптоПро завершен. Можно проверять работу. Я не раз пользовался этим методом, на текущий момент он 100% рабочий. Написал статью, чтобы помочь остальным, так как сам не видел в интернете подробной и понятной с первого раза статьи на эту тему. Надеюсь, моя таковой получилась.
КриптоПро CSP ошибка 0x80090010 Отказано в доступе
Иногда после переноса контейнеров закрытых ключей через экспорт — импорт ветки реестра с ключами можно увидеть ошибку доступа к контейнерам. Вроде бы все на месте, ключи есть в реестре. Их можно увидеть в останстке CryptoPro, но не получается прочитать. При попытке это сделать возникает ошибка:

Ошибка обращения к контейнеру закрытого ключа. Ошибка 0x80090010: Отказано в доступе. Связано это с тем, что у текущего пользователя, под которым вы хотите получить доступ к контейнеру, нет полных прав на ветку реестра с хранящимися ключами. Исправить это просто. Переходите в редактор реестра и выставляйте полные права к ветке Keys для текущего пользователя.

Убедитесь так же, что новые права наследовались на дочерние ветки с самими ключами. Обычно это так, но перепроверить на всякий случай непомешает. После этого ошибка с доступом к контейнеру закрытого ключа исчезнет.
Часто задаваемые вопросы по теме статьи (FAQ)
Можно ли перенести сертификат, который находится на токене и защищен от копирования?
Очевидно, что предложенное в статье решение для этого не подойдет. Ведь тут идет речь о переносе сертификатов, которые хранятся в реестре, то есть уже были скопированы. Технические средства для копирования защищенных крипто контейнеров тоже существуют, но это не такое простое и очевидное решение.Безопасно ли хранить сертификаты в реестре?
Это не безопасно и в общем случае я не рекомендую это делать. USB токены для хранения сертификатов придуманы не просто так. Они реально защищают сертификаты от несанкционированного копирования. Если у вас нет объективной необходимости копировать сертификаты в реестр, лучше этого не делать. Если вам нужно сделать бэкап сертификата на случай поломки токена, то просто скопируйте его в зашифрованный архив и сохраните на флешке.Подойдет ли предложенный способ копирования сертификатов CryptoPro для VipNet?
Нет, не подойдет. В статье описан способ переноса сертификатов CryptoPro. Другие криптопровайдеры хранят сертификаты по-другому. Универсального способа для всех не существует.Есть ли какой-то очень простой способ скопировать сертификаты crypto pro? То, что описано в статье слишком сложно для меня.
Да, есть статья на сайте контура, в ней ссылка на утилиту для копирования контейнеров Certfix. Можете воспользоваться ей.
Ошибка копирования контейнера
Бывает случаи, когда при копировании сертификата возникает ошибка: «Ошибка копирования контейнера». Делимся инструкцией, что делать в такой ситуации.
При копировании сертификата возникает ошибка:
«Ошибка копирования контейнера 123456789@28-07-2011 Иванов Иван Иванович: У вас нет разрешений на экспорт ключа, потому что при создании ключа не был установлен соответствующий флаг. Ошибка 0x8009000B (-2146893813) Ключ не может быть использован в указанном состоянии»
Для решения данной проблемы необходимо:
- Проверить наличие лицензии на КриптоПроCSP. Ошибка может возникать на КриптоПРО CSP с истекшими сертификатами со встроенной лицензией. Для автоматического ввода лицензии нужно перейти ссылке и установить лицензию по инструкции.
- Повторить копирование сертификата.
- Если в имени контейнера есть строка типа: _копия_a0b63dd8 (например 06208439@2016-12-29-ЗАО ПФ СКБ Контур_копия_a0b63dd8), то контейнер имеет признак неэкспортируемый. Следуйте инструкции в зависимости от носителя:
Сертификат в реестре, на USB-флеш-накопителе, локальном компьютере или дискете.
Чтобы сделать копию такого сертификата, необходимо:
- Скачать утилиту CertFix версия 2.8.
- Скачать утилиту CertFix версия 2.7 именно эта версия подходит для разблокировки копирования
- Запустить утилиту, подождать, когда загрузится список сертификатов. Напротив строки «Поиск» появится информация «Загрузка завершена».

- Одновременно нажать кнопку SHIFT на клавиатуре и правой кнопкой мыши кликнуть по нужному контейнеру.
- Появится меню «Сделать экспортируемым». ВНИМАНИЕ появится только при условие купленной лицензии на крипто про. Нужно выбрать вариант в зависимости от расположения контейнера.

Если на контейнер указан пароль, введите его.
- Повторить процедуру копирования сертификата.
Управляемые токенами реестры 1.0

Идея управляемых токенами реестров (TCR) зародилась в блокчейн-сообществе не менее года назад. По крайней мере, эта статья была опубликована автором еще в сентябре 2017 года. А недавно я был на конференции DappCon 2018 в Берлине и увидел большой интерес к этой теме, а также несколько ранних набросков на основе TCR. Поэтому предполагаю, что пик интереса еще впереди.
Мне TCR-контракты представляются крайне интересными, поскольку они являют собой пример наиболее простой замкнутой системы, управляемой децентрализованно и на основе экономических стимулов. Если немного пофантазировать, становится понятно, что на основе этой идеи можно децентрализовать очень многое, возможно даже всё в нашей социально-экономической жизни. И это уже не просто галлюцинации сумасшедших криптанов, а вполне неплохо сформулированный протокол. Более подробно читайте под катом.
Управляемые токенами реестры (token-curated registries, TCR) — это криптосистемы, которые всё шире применяются для решения различных задач. В этой статье мы представим более формальный взгляд на управляемые токенами реестры, но без математики.
В заголовке проставлена версия 1.0, потому что TCR и система стимулирования, описанные ниже, наверняка будут улучшены. Надеемся, этот документ станет отправной точкой для обсуждений, как улучшить TCR. Многие подобные реестры, развёртываемые сегодня, схожи, но применяют разные механики. Мы верим в «правильный» способ создания реестров, управляемых токенами, и в то, что возможно полностью переиспользовать устоявшуюся реализацию.
Применение реестров, управляемых токенами
Результат работы TCR — это список. У людей тяга к их составлению, и мы повсюду видим списки: покупок, «хороших» вузов, самых разыскиваемых преступников. Некоторые списки можно классифицировать как белые или чёрные. В любом случае содержимое списков удовлетворяет каким-то критериям (товары, которые нужно купить; вузы, чьи выпускники расплачиваются с долгами за учёбу в среднем за 10 лет; люди, за информацию о которых ФБР назначило награду более 100 000 долларов).
Полезные списки кто-то формирует. Список покупок обычно создаёт один человек. А за список лучших вузов, вероятно, отвечает комиссия. Если такой список сможет пополнять кто угодно, то скоро мы получим бесполезный перечень всех вузов, ведь любой ректор захочет, чтобы его заведение там упоминалось.
В TCR для назначения прав управления (curation rights) используются внутренние токены пропорционально их условному весу у субъектов — держателей токенов. Если есть компании, которые хотят попасть в список, то возникнет и рынок, где материальные интересы рациональных держателей токенов приведут к созданию качественного списка. TCR — это списки с децентрализованным управлением, они финансово стимулируют держателей токенов взвешенно формировать содержимое списков.
Точки зрения пользователей
Выделим три типа пользователей TCR: потребители, кандидаты, держатели токенов. У каждого типа — свои интересы, мотивы и способы взаимодействия с реестром. Потребители ищут качественные списки. Кандидаты стремятся туда попасть. Держатели токенов хотят повысить стоимость своих токенов.
Потребителям нужна качественная информация. Если школьник выбирает вуз на основании списка заведений, чьи выпускники расплачиваются с долгами за учёбу в среднем за 10 лет, то будет очень разочарован, обнаружив, что вуз ошибочно отнесли к такой категории.
Кандидаты желают добиться внимания потребителей. Вуз — участник списка (listee), допущенный в реестр, вероятно, получит больше заявок на поступление, чем если бы он не входил в список. Благодаря этому он сможет даже повысить оплату за обучение.
Держатели токенов хотят сохранить высокий спрос на токены, поскольку это увеличивает их стоимость. В противном случае держатели не будут заинтересованы в качественном содержимом управляемых ими списков. В примере с вузами держатели не должны быть ни потребителями реестра, ни кандидатами на включение в него. Чтобы спрос на токены не падал, держателям нужно сохранять высокое качество списков. Если реестр качественный, кандидаты захотят попасть в него, а потребители — ознакомиться с ним.
Держатели токенов, мастерски управляя списком, могут получить прибыль. Её размер зависит от качества управления и роста интереса потребителей и кандидатов.
Система стимулирования в TCR
Держатели токенов — это двигатель криптоэкономической игры, которая регулирует TCR. Чтобы реестр работал, кандидаты должны внести депозиты во внутренних токенах реестра, и тогда их заявки на включение в список рассмотрят. Если кандидат «хороший», он вносится в список, его депозит сохраняется. Решив покинуть список, участник может отозвать свой депозит. Если кандидат «плохой», держатели оспаривают его заявку, и после её отклонения депозит будет конфискован и поделён в качестве награды среди держателей токенов, которые участвовали в оспаривании. Кандидаты не будут подавать заявки в реестр, если не соответствуют его требованиям: это приведёт к финансовым потерям. Вуз, который не предлагает ничего путного и требует 50 000 долларов в год, вряд ли примут в реестр вузов, чьи выпускники расплачиваются с долгами за обучение в среднем за 10 лет, поэтому не стоит и пытаться. Держатели токенов могут увеличить свои накопления благодаря такому кандидату. Скорее всего, его заявку оспорят, но есть ненулевая вероятность, что заявку примут.
У держателей токенов есть тактический стимул отклонить каждого кандидата, чтобы увеличить свои накопления. Но это глупо, поскольку стратегическая задача — увеличить стоимость накоплений. Пустой список не нужен потребителям, поэтому кандидаты не будут стремиться в него. От кандидатов зависит фундаментальный спрос на внутренний токен реестра. Действуя тактически, а не стратегически, держатели токенов понесут серьёзные финансовые потери. В их интересах — достичь стратегической цели и создать качественный список.
Параметры TCR
Раздел можно использовать как справочник, поскольку в дальнейшем мы не раз упомянем перечисленные здесь параметры. Мы будем называть их снимками (snapshot) параметров и текущими обязательными (current canonical) параметрами. Снимок фиксирует значения текущих обязательных параметров в некий момент времени, они «застывают» в снимке и не меняются, даже если текущие обязательные параметры изменились. Если не указано иное, упомянутый в тексте параметр — это именно текущий обязательный параметр.
MIN_DEPOSIT
Столько токенов кандидат должен внести в качестве депозита за принятие в список и нахождение в нём.
APPLY_STAGE_LEN
За это время включение кандидата в список можно оспорить. Измеряется в блоках или эпохах. Если оспаривания не было, кандидат попадает в список.
COMMIT_PERIOD_LEN
За это время держатели токенов могут проголосовать за оспаривание. Измеряется в блоках или эпохах.
REVEAL_PERIOD_LEN
За это время держатели токенов могут огласить голоса за конкретное оспаривание. Измеряется в блоках или эпохах.
DISPENSATION_PCT
Доля конфискованного депозита, которая присуждается победителю в качестве особого разрешения (special dispensation), компенсирующего финансовые риски.
VOTE_QUORUM
Обнародованная доля общего количества токенов, необходимая для того, чтобы оспоренный кандидат попал в список / оспоренный участник остался в списке. VOTE_QUORUM не подсчитывает токены, которые не голосовали, а необнародованные токены считаются неголосовавшими. К примеру, VOTE_QUORUM 50 означает, что все оспаривания решаются простым большинством.
Позиции (listings)
Позиция — элемент из единого набора перечисленных в списке элементов, которые содержатся в TCR. В примере с вузами позиция может быть простым строковым значением, идентифицирующим вуз по его хорошо известному названию, например Foo University. Выбирая форму позиции, помните, что она будет аутентифицировать реальный объект. В случае с вузами достаточно взять их названия, поскольку подделка физической и социальной организации перечисленных в списке вузов ради обмана потребителей потребует слишком серьёзных усилий (фальшивые кампусы, персонал, удостоверения и т. д.).
Средства аутентификации, насколько это возможно, оставляйте на усмотрение пользователей. Скажем, пользователи реестра доменных имён могут аутентифицировать свои подключения к доменам с помощью сертификата HTTPS, сети доверия (web-of-trust) или хешированных секретных значений, которые хранятся в метаданных списка и предоставляются в качестве подтверждения от оракула. Важно, чтобы участники списка и потребители де-факто приняли как минимум одно средство аутентификации, поддерживаемое обеими сторонами, в противном случае реестр будет бесполезен.
Подача заявки
Когда кандидат на включение в список TCR подаёт заявку, он должен внести депозит во внутренних токенах реестра. Минимальный размер — MIN_DEPOSIT , столько токенов будет выставлено в качестве депозита при оспаривании заявки. Заявка будет рассмотрена (resolved) спустя APPLY_STAGE_LEN . Если за это время заявку никто не оспорил, кандидат становится участником списка. В противном случае статус кандидата определяется по результатам оспаривания.
Заявка содержит снимок текущих обязательных параметров, и все действия с заявкой ссылаются на её зафиксированные в снимке параметры.
Оспаривание заявки
Оспаривание инициируется применительно либо к кандидатам, которые ожидают рассмотрения заявки, либо к участникам списка. Допускается лишь одно активное оспаривание по отношению к каждому кандидату или участнику. Инициатор оспаривания выставляет депозит в размере MIN_DEPOSIT против позиции списка или заявки, чей депозит превышает MIN_DEPOSIT либо равняется ему. (Об оспаривании позиций с депозитом меньше MIN_DEPOSIT мы поговорим в разделе «Краевая ситуация: touch-and-remove».)
Когда оспаривание инициировано, создаётся снимок текущих обязательных параметров реестра и начинается голосование (см. раздел «Голосование»), в котором может участвовать любой держатель токенов. После голосования конфискуется депозит либо кандидата, либо инициатора оспаривания. Победившая сторона получает часть конфискованного депозита ( DISPENSATION_PCT ) в качестве компенсации за финансовый риск. Оставшаяся часть депозита распределяется между участниками голосовавшего большинства в соответствии с весом их токенов. Участники голосовавшего меньшинства ничего не теряют и не получают.
Примечание. DISPENSATION_PCT , по существу, даёт инициатору оспаривания уверенность в возможности выиграть голосование. В результате выигрыша фактически произойдёт публикация (issue) оспаривания. Если особое разрешение (special dispensation) определено, например, на уровне 50 %, то оспаривающий должен быть более чем на 66 % уверен в возможности победы. Почему 66 %? Потому что существует 33%-я вероятность полностью потерять депозит и 66%-я вероятность заработать половину депозита: (0,33)(–1) + (0,66)(0,5) = 0.
Если оспорена заявка, то она удаляется, а кандидат может стать или не стать участником списка. Если оспорена позиция списка, то позиция может быть удалена или не удалена.
Краевая ситуация: touch-and-remove
Если кандидат внёс депозит, стал участником, а позже значение текущего обязательного MIN_DEPOSIT увеличилось, то депозит участника окажется меньше MIN_DEPOSIT . Если оспорена такая позиция, она немедленно убирается из списка, а депозиты оспаривающего и участника списка возвращаются владельцам. Это и есть touch-and-remove.
Почему и зачем нужен такой подход? Примем, что размеры депозитов при оспариваниях должны быть одинаковыми, чтобы на действия голосующих не влияло желание поделить самый большой депозит (это даст им наибольшую прибыль). Тогда почему бы нам не приравнять размеры депозитов при оспариваниях к размерам депозитов самих оспариваемых позиций? Возможна ситуация, когда депозит из-за колебаний рыночной цены токена стал дешевле газа и альтернативных издержек (opportunity cost). Участники понесут эти издержки, если инициируют оспаривание или поучаствуют в голосовании. Подход touch-and-remove снижает возможность отравить реестр записями, чьи депозиты слишком малы для оспаривания: активные держатели токенов просто удалят такие позиции с минимальными затратами.
Чтобы защититься от touch-and-remove после повышения MIN_DEPOSIT , участники списка могут сколько угодно увеличивать свои депозиты, причём любой объём сверх обязательного MIN_DEPOSIT можно в любое время отозвать. При оспаривании размер текущего MIN_DEPOSIT фиксируется в снимке, и только это количество разрешается поставить на кон.
Голосование
Голосование в TCR должно быть token-weighted и проходить по схеме commit-reveal. Иных особых требований к голосованию нет, главное, чтобы механизм был эффективен с точки зрения ликвидности токенов.
Характеристика token-weighted (условный вес токенов) важна для держателей, которые вложили больше всего токенов, а значит, их голос при управлении реестром наиболее весомый. Такие держатели будут самыми осмотрительными. А благодаря схеме commit-reveal голосование стимулирует участников исключительно к наибольшей продуктивности. Ликвидность токенов нужно максимизировать, чтобы поощрять участников голосовать.
PLCR-голосование (Partial Lock Commit Reveal Voting) — самый эффективный механизм голосования на основе токенов для TCR.
Параметризация
Параметры реестра должны адаптироваться к динамике изменения рыночной цены внутреннего токена реестра. Например, цена падает, появляются сотни кандидатов на включение в реестр, и держатели токенов не могут эффективно обработать все заявки. Тогда нужно увеличить MIN_DEPOSIT .
Пока нет однозначного ответа, как лучше всего выполнять параметризацию, т. е., по сути, управлять реестром. К примеру, в AdChain принципы параметризации те же, что и принципы обработки заявок на включение в реестр. Здесь используется другой набор тех же параметров, поэтому для предложения о репараметризации MIN_DEPOSIT может быть куда более высоким, чем если бы речь шла о включении новой позиции. Предложения о репараметризации тоже оспариваются с помощью токен-депозитов, их размещают и предлагающий, и оспаривающий. Держатели токенов могут голосовать за репараметризацию параметров реестра или параметров самого репараметризатора.
Интересные свойства TCR
Внутренние токены реестров — необходимый элемент самодостаточных систем для публичного использования. Сами TCR — главные враги капитализма, они выполняют полезную функцию при минимально возможных маржинальных издержках.
Управляемые токенами реестры удовлетворяют принципам Mike’s Cryptosystems Manifesto
Для TCR нужны внутренние токены. Использование чего-либо другого вместо них нарушит нормальную работу системы. Держатели токенов должны понимать плюсы и минусы своей хорошей или плохой работы, тогда у них появится мотивация для основной задачи — управления реестром. К примеру, на цену биткоина не повлияет снижение спроса на него в списках реестров. Значит, держатели захотят собрать с кандидатов как можно больше биткоинов с помощью ложных оспариваний и сговоров на голосованиях, отодвинув интересы управления реестром на второй план. А если единственное назначение токена — использование при подаче заявок в реестр, его цена будет меняться в зависимости от спроса на участие в списках. На спрос влияет то, насколько качественно держатели управляют списками. Принцип необходимости токена (token-necessity) в TCR соблюдён.
Система самодостаточна, если она нормально функционирует без участия своих создателей. В TCR ни у одной записи нет особых привилегий. Все токены равноценны, и лишь вес токена определяет вес привилегий его держателя в реестре. Создатель реестра может исчезнуть, а замкнутая система стимулирования от этого никак не пострадает. TCR — настоящие децентрализованные системы. Принцип самодостаточности соблюдён.
Система публично используема (public utility), если она не требует разрешений, свободна от арендной платы и приносит пользу. TCR не требуют разрешений, полностью децентрализованы, а привилегии в них определяются лишь условным весом токенов. Такие реестры не требуют арендной платы, поскольку никогда не будут поставлены на кон ради стимулирования кого-то выполнить задачу или удержания от атаки. TCR генерируют полезный результат в виде списков. Принцип публичного использования соблюдён.
Главные враги капитализма
Системы, создающие полезный результат при минимальных маржинальных издержках, — это и есть главные враги капитализма. Результат работы TCR бесплатен: списки хранятся в блокчейне, любая сторона может их считать. Вместо того чтобы отдавать деньги вендору за составление списка, потребители TCR бесплатно получают продукт всех вендоров. Те соперничают друг с другом в создании лучшего списка, какой только может появиться на свободном рынке.
Желающие улучшить качество TCR могут купить токены по рыночной цене, качественно управлять реестром, подогреть интерес потребителей, увеличить спрос кандидатов на токен — а затем продать свои токены, заработав на тех, кто хочет улучшить реестр. Держатель токена, который хорошо умеет выдвигать оспаривания и голосовать, обеспечит себе постоянный доход, продавая полученные от конфискованных депозитов токены и не теряя основной капитал.
Таким образом, на эффективном рынке внутренние токены реестров со временем оптимально распределятся среди субъектов, которые используют их наиболее продуктивно. В TCR прибыльность и продуктивность тесно взаимосвязаны.
Атаки и защита от них
TCR теоретически возможно атаковать. Кроме того, наверняка ещё не все разновидности атак сформулированы и зафиксированы. Ниже мы обсудим известные атаки и защиту от них.
Простой троллинг
Тролль пытается добавить в «хороший» реестр «плохие» позиции, которые не удовлетворяют критериям реестра. Если за реестром хорошо следят, такие атаки дороги и неэффективны: тролль теряет депозит, когда рациональный держатель токенов успешно оспаривает заявку. Чтобы преодолеть рациональность голосующих, простая троллинг-атака должна превратиться в атаку сумасшедшего.
Атака сумасшедшего
У обеспеченного ресурсами злоумышленника могут быть рациональные причины потратить много средств на уничтожение реестра. Если полезный список при почти нулевых маржинальных затратах разрушает бизнесы, то пострадавшим компаниям это наверняка не понравится. Злоумышленник скупит по рыночной цене большинство защищённых от оспаривания токенов с правом голоса и заполнит реестр низкокачественными позициями. Реестр будет испорчен, стоимость токенов обрушится.
К счастью, управляемые токенами реестры имеют свойства защиты от подобных атак, довольно похожие на те, что характерны для Casper. С точки зрения финансов при атаке 51 % оружие злоумышленников можно уничтожить с помощью хардфорка. Как говорит Виталик, «задача в том, чтобы сделать атаку 51 % крайне дорогой, чтобы даже большинство совместно работающих валидаторов не могли откатить финализированные блоки без крайне тяжёлых финансовых потерь. Настолько тяжёлых, что даже успешная атака наверняка приведёт к увеличению цены на базовую валюту, поскольку на сокращение общего предложения монет рынок будет реагировать сильнее, чем на экстренный хардфорк для ослабления атаки». В TCR валидаторы — это держатели токенов.
Вероятно, на практике в любое время лишь меньшая часть токенов будет активно участвовать в голосовании (см. раздел «Bootstrapping»), поэтому атаки сумасшедшего окажутся не столь дороги, как подразумевает ярлык «атака на большинство валидаторов». Уменьшение пассивности держателей токенов — важный открытый вопрос в TCR.
Отравление реестра (registry poisoning)
Отравлением реестра занимается не держатель токена, а участник списка. В реестр вносится позиция, а после её качество ухудшается. Например, вуз, включённый в список высококачественных учебных заведений, благодаря этому повышает стоимость обучения, но его выпускники позднее обнаруживают, что не могут расплатиться с долгами за обучение через 10 лет.
Рациональные держатели токенов должны выявлять такое поведение и оспаривать позиции, отравляющие реестр. Малоизученный аспект: отравление может быть относительно дешёвым, если позиция списка только ждёт, пока MIN_DEPOSIT увеличится во время действия списка, а если неправомерные действия обнаружат — то можно покинуть список по процедуре touch-and-remove. В этом случае позиция списка не теряет депозита, однако сам субъект теряет репутацию и больше не вернётся в список.
Бросание монеты и мемизация голосования
Голосующих не наказывают за плохие решения, поэтому держатели токенов могут обнаружить, что проще «бросать монету», чем тратить время на взвешенные оценки. Защититься от атаки можно при долгосрочной заинтересованности голосующих в максимизации спроса на токен. Но неизвестно, в какой мере эти соображения повлияют на возникновение критической массы голосующих, нивелирующих безответственное поведение других.
Бросание монеты — атака не слишком опасная: предположив равномерное распределение голосов в результате бросания монеты, немногочисленные активисты — держатели токенов при любом оспаривании склонят чашу весов в пользу рациональности.
Мемизация голосования (vote memeing) происходит, когда участники голосуют лишь ради того, чтобы оказаться в большинстве. С точки зрения мотивации аналогично бросанию монеты, но результат хуже: меньшинство активистов — держателей токенов не склонит чашу весов в пользу рациональности.
Бросание монеты и мемизация голосования — комплексные атаки, потому что они нацелены на пределы рациональности держателей токенов (см. «Пределы рациональности»).
Открытые вопросы
Пределы рациональности
Бывают стратегии, рациональные «здесь и сейчас», но вредные в долгосрочной перспективе. Пассивное держание токенов само по себе нежелательно, бросание монеты и мемизация голосования рациональны, но со временем ухудшают качество реестра. Каких оптимальных стратегий будут придерживаться участники? Может ли возникнуть ситуация, когда кто-то действует тактически, а кто-то стратегически, и в результате качество списков окажется средненьким, ниже, чем если бы список управлялся централизованно?
Bootstrapping
TCR свойственна дилемма первичности курицы и яйца. Потребителей не привлекает пустой список, а кандидаты не хотят участвовать в списке, который неинтересен потребителям. В целом реестру трудно будет обрести интерес любой из групп участников, чтобы достичь устойчивого самодостаточного состояния. Есть разные мнения об оптимальном подходе к созданию управляемого токеном реестра, и пока ни один из подходов не превратился в чёткий паттерн, которому нужно следовать.
Один подход: группа кандидатов в сотрудничестве с «устаревшими» руководящими органами (отраслевыми лобби, консультативными советами) формирует начальный набор участников. Мотивация: использовать проверенных отраслевых кураторов для создания убедительного базового набора позиций в реестре.
Другой подход: первоначально токены реестра распределяются среди потенциальных потребителей и кандидатов. Это даёт сторонам (в противном случае незаинтересованным) осязаемую мотивацию для самостоятельного взращивания системы.
Минимальный размер экономики
Каков минимальный размер экономики, необходимой для децентрализованного управления списком? Выгодно ли экономически децентрализованно управлять списком покупок? Будет ли рационально для производителя фасованных товаров и продуктов подавать заявки на включение в реестр позиций, которые необходимо приобретать в продуктовом магазине? Смогут ли голосующие управлять списком, который полезен для покупателей? Откуда голосующим узнать, достаточно ли покупателю сыра? Какой минимальный интерес потребителей нужен для децентрализованного управления списком?
Параметризация
Параметризация реестров на сегодняшний день не проработана хорошо. Возможно, тот же параметризатор AdChain можно довести до постоянной нестабильности. К примеру, задав нулевое значение для MIN_DEPOSIT параметризатора. Тогда тролли без особых усилий неограниченное время станут сохранять нулевое значение MIN_DEPOSIT , поскольку после успешной первоначальной атаки можно создать множество предложений, которые позднее будут обработаны и активированы в любое время. Защита от подобной атаки на параметризатор AdChain зависит от осмотрительности держателей токенов. Реестры оправятся от последствий недосмотра держателей и отравлений средствами оспаривания, но параметризаторы могут быть безвозвратно повреждены даже после одной успешной атаки.
Экспортировать неэкспортируемый сертификат с рутокена
Небольшая заметка как экспортировать неэкспортируемый ключ с Rutoken.
Внимательно читайте комменты
Если при создании ЭЦП не был установлен флаг дающий возможность экспортировать ключ, то при попытке скопировать ключ с Rutoken через КриптоПро у вас появится «Ошибка копирования контейнера. У вас нет разрешений на экспорт ключа, потому что при создании ключа не был установлен соответствующий флаг».
Но скопировать его все равно можно — для этого понадобится специальное ПО:
1. Утилита проверки Рутокенов версии 3.4.2
2. Сертфикс 1.1.27.3154
При помощи утилиты проверки Рутокенов версии 3.4.2 вы сможете экспортировать ключ с Рутокен на флешуку или реестр
После чего при помощи помощи Сертфикс 1.1.27.3154 вы сможете снять блокировку зажав клавишу Shift и кликнув по нужному сертификату правой кнопкой мыши выбрав пункт активации экспорта согласно вашему новому месту хранения выбранного в утилите проверки Рутокенов.
Важным моментом является то, что версия Сертфикс выше 1.1.27.3154 может быть программно ограничена на возможность сделать сертификат некоторых удостоверяющих центров экспортируемым.
Обновление программа проверяет при запуске, поэтому чтобы обновление не загрузилось необходимо заблокировать доступ в интернет для нее через брандмауэр Windows.
A Windows Authorization Guide
Compared to Linux, the Window’s authorization process is quite complex and quite a few actors and objects are involved in this process. As a result, there a lot of terms and acronyms that must be known in order to understand and follow up on the topic. To get an idea of what is covered in this guide take a look on this overview of terms and acronyms:

Facing this wall of acronyms, i’d say the best to get into this complex environment is to dive right in and cross reference all new terms.
For all of the following (and in general) be aware that there is a Windows Security Glossary that you could use to look up any acronym or term used in the following.
Basic Access Check
Starting with the simplest scenario: You log onto your Windows system and want to open a file. Who decides if you get access and how is this decision made?
As a reference recap how this decision is made on Unix systems. On Unix systems your user has a user- & group-ID and the access target (the file in this scenario) has an associated list of access permissions that could look like this:
The Unix OS checks these file permissions, figures that everyone got read access rights and grants the logged in Unix user read access. Most of the Unix authorisation decisions can be broken down to this very simple access check.
Now let’s dive into the Windows World:
Let’s start simple: When a user logs into his Windows machine (regardless if that is a local or a domain joined user), an Access Token is created for that user. Precisely that means this access token is created for that user’s logon thread.
When that logged on user tries to open a file, an access request is generated that specifies what the user wants to do with that file (access right). In our case the user simply wants to read a file, which maps to the GENERIC_READ access right. There are a set of different access rights, which at the end of the day are all just bitmasks representing numbers that serve as a global reference to have a clear definition of what the user requests to do. The most important access rights are the Generic Access Rights and the so called Standard Access Rights.
The user’s access request is taken on by a Windows component called the Security Reference Monitor (SRM), which takes on the requested access right along with the user’s Access Token and compares these bits of information against the defined access permissions for the requested file, which are composed in a structure called Security Descriptor.
Important to note here: Each Securable Object, which include files, directories, registry keys and many other things, has a Security Descriptor.
Okay let’s break that down in key »Take aways«::
- Each user logon thread has an access token
(Read this as: Each user got assigned an access token) - A required action, e.g. to open a file, is expressed in an Access Right, e.g. GENERIC_READ
- Each Securable Object has a Security Descriptor, which defines who can do what with that object.
- The Security Reference Monitor (SRM) is the software component in charge to evaluate if a certain process should be granted access to the requested object for the requested access right.
The key function for granting or denying access within the SRM is called SEAcessCheck.
And since I really like visual representation of things, take the following picture to get an overview of what has just been introduced:
(I based that representation on a figure James Forshaw used in his 2015 BlackHat Talk)

Now that the basic concept of access checks in the Windows world has been introduced, let’s dig deeper into the individual components.
The Security Descriptor, DACL & SACL
This section will bring light on the Owner- and the DACL-Check shown in the figure above.
As mentioned previously each Securable Object has a Security Descriptor.
The Security Descriptor defines an object structure to keep record of to whom the referenced object belongs (Owner and Group) and to whom access is granted (or denied) for which actions.
To get an idea of what this looks like the following screenshot shows the Security Descriptor (as kernel object) of the running explorer.exe process:

The most basic part here is the Owner and Group field, which are expressed by a Secure Identifier (SID). In the Windows world a SID is just a unique string to identify a security principal, e.g. a user, a group, etc. The SID consists of three blocks:
- The first part — always beginning with an ‘S’ — describes the group, e.g. Domain Everyone (S-1-1-0), Anonymous (S-1-5-7), Authenticated Users (S-1-5-11), which can be looked up in the register for Well-known SIDs.
- The second part is a unique domain ID (also present in each default WORKGROUP) (S-1-5-21), e.g. S-1-5-21-2884053423-3431565070-78458365-….
- The last part is called the relative ID (RID), which describes a user group inside a security group, e.g. the group of builtin Administrator group (S-1-5-32—544) or the builtin Guests group (S-1-5-32—546) or the famous default Admin account — by me often referred to as RID-500 Admin — (S-1-5-21-2884053423-3431565070-78458365—500). Note how the first two groups are in the same security group (S-1-5-32-…), while the RID-500 admin is in the domain security group.
Okay now back to our example from above: The Owner is set to the SID of S-1-5-21-…..-1001, which is the unique value for my current user and the group is set to the SID of S-1-5-21-…-513, which is the domain users group.
You can look up these SIDs in the register for Well-known SIDs
Apart from the owner and group of the explorer.exe process, the above shown Security Descriptor also contains two lists, the Discretionary Access Control List (DACL) and the System Access Control List (SACL):
The DACL is a list controlled by the owner of the Security Descriptor, that specifies the access particular users or groups can have on the object.
The SACL is a list controlled by system administrators, which holds two types of control entries:
- The SACL holds the MANDATORY_INTEGRITY_LABEL (more on this later); and
- The SACL holds control entries used for the generation of audit messages (which we ignore for now)
For the SACL just keep in mind that the MANDATORY_INTEGRITY_LABEL is stored in here (we ignore the rest for now…).
The DACL is the important control list used for the authorization process. Review the screenshot above and see that the presented DACL actually contains three Access Control Entries (ACEs). For each of the three ACEs the following important fields are set:
- SID: The SID defines the Security Principal (a user or group) to which the ACE applies.
S-1-5-21-…..-1001 references to one specific domain user.
S-1-5-18 references the local System account. - Mask: The access mask is a numeric value, which resembles a combination (addition) of multiple Access Rights, e.g. GENERIC_READ. The access mask is a data structure described in the Microsoft Docs here.
- AceType: The AceType defines whether access should be allowed or denied for the given security principal (SID) and based on the given access mask.
In the example above three ACEs with AceType ACCESS_ALLOWED_ACE_TYPE are given, which means that if the Security Reference Monitor (SCM) finds a matching access mask for the requesting user in any of these ACEs access will be granted.
For this part the important »Take away«: is:
The SCM will review the Security Descriptor of the requested object and iterate over each ACE in the Security Descriptor’s DACL and check whether the requesting user — identified by it’s SID and requested access right (e.g. GENERIC_READ) match with an Access Mask inside of an ACE. If a match is found the AceType of that ACE will determine if access is granted or denied.
A side note on empty DACLs:
If a DACL of a Security Descriptor is set to NULL, aka the Security Descriptor has no DACL, than full access is granted to everyone.
If the DACL of a Security Descriptor is empty, aka a DACL exists, but does not contain any ACEs than no access is granted to that object.
The last bit of information that is missing is the identity of the requesting user. The SRM gets the identity of the requesting user from the given user access token. Insights of how this token looks like will be given later, for now it’s just important to know that this token contains the SID of the requesting user, as well as the SID of the user’s groups.
Okay and now let’s put in the full picture for the SeAccessCheck:
After the Integrity Level-Check (IL-Check), which will be described in the following section, the Security Reference Monitor (SRM) queries the Security Descriptor of the requested object for the following information:
- Who is the owner of the requested object?
→ If the requesting user is the owner of the requested object: Grant Access - If the requesting user is not the owner, iterate over all ACEs in the DACL of the Security Descriptor and determine:
– Does the ACE apply for the requesting user by comparing the ACE SID to the user SID and his/her group SIDs ?
– Does the access mask contain the requested access right, e.g. does the access mask contain the GENERIC_READ access right ?
– Does the access type is set to allow access or is it set to deny access? - If any ACCESS_DENIED_ACE_TYPE matches the user and requested access right: Deny Access
- If no ACCESS_DENIED_ACE_TYPE but a ACCESS_ALLOWED_ACE_TYPE matches the user and requested access right: Grant Access
Next to the Owner and DACL checks there is only one element missing to understand the SeAccessCheck, which is the Integrity Level Check (IL-Check). So let’s dive into that.
Integrity Level Check / Mandatory Integrity Control (MIC)
This section will bring light on the Integrity Level Check shown in the figure above.
The Integrity Level check is meant to enforce another Windows control layer, called Mandatory Integrity Control (MIC).
Mandatory Integrity Control (MIC) provides a mechanism for controlling access to securable objects. This mechanism is in addition to discretionary access control and evaluates access before access checks against an object’s discretionary access control list (DACL) are evaluated.
Source: Mandatory Integrity Control
The first question that should arise in your head now is:
Why the f** do we need MIC? We got DACL checks, which are basically the same checks that are done in Unix systems – shouldn’t that be enough?*
The answer to this question is: Yes the DACL checks are the core of the authorization checks and the vast majority of all access request will be granted or denied based on the DACL checks. MIC is just another layer added by Microsoft in Windows Vista alongside with User Access Control (UAC) to get more fine grained control and to prevent compromised processes from accessing sensitive resources.
This is a very abstract answer to a simple question, but the following introduction to MIC and UAC will hopefully shed some more light on this.
Each Securable Object got a MANDATORY_INTEGRITY_LABEL set in it’s SACL. This label assigns one of four possible Integrity Levels (IL) to the object (as defined in Windows Integrity Mechanism Design):
- Low (SECURITY_MANDATORY_LOW_RID 0x00001000)
- Medium (SECURITY_MANDATORY_MEDIUM_RID 0x00002000)
- High (SECURITY_MANDATORY_HIGH_RID 0X00003000)
- System (SECURITY_MANDATORY_SYSTEM_RID 0x00004000)
These Integrity Levels label the degree of ‘security protection’ that has been assigned to a Securable Object.
»By default all objects are assigned with a Medium Integrity Label.
As an example refer back to the previous screenshot of the Security Descriptor, notice that the Security Descriptor of this object (the explorer.exe process) got the following MANDATORY_INTEGRITY_LABEL: SID: S-1-16-8192
A quick look up to the Well-known SIDs Register reveals that this SID describes the ‘Medium Mandatory Level’ (default for all objects).
»Take away«:
The whole story of integrity labels is to prevent lower level integrity processes from accessing higher level integrity objects.
Another example: When starting the Internet Explorer, a low Integrity Level IE process will be spawned (see screenshot below). This low level IE process is the process that is used by the user for surfing the internet.
If this process is compromised, e.g. by exploiting an IE/Flash/etc. vulnerability, the process would not be able to access a user’s documents, because these were created with the default medium Integrity Level label (and the IE process is running with low integrity).

This is the point where the Integrity Levels checks should begin to make sense. Imagine the compromised IE scenario without MIC. The IE process has been launched by the logged in user and therefore is owned by the logged in user. The DACL-check would therefore grant the compromised IE process access to the user’s resources.
By enforcing an IL-Check, access to user resources is denied to the compromised IE process.
So am I saying that access is generally denied when a process with a lower Integrity Level tries to access a resource with a higher Integrity Level? Of course not – why should it be that simple…
During the Integrity Level check, the SRM compares the Integrity Level of the requesting process with the Integrity Level of the requested object and decides to go to the DACL check or denies access based on the Integrity Level Policy defined for that object.
The Integrity Level Policy of an object is based on the following three defined states (as defined in the SYSTEM_MANDATORY_LABEL_ACE Structure):
- SYSTEM_MANDATORY_LABEL_NO_WRITE_UP ( 0x1 )
- SYSTEM_MANDATORY_LABEL_NO_READ_UP ( 0x2 )
- SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP ( 0x4 )
Once again refer back to the Security Descriptor of the running explorer.exe given in the previous section. Notice that the Access Mask of the SACL ACE SYSTEM_MANDATORY_LABEL_ACE_TYPE is set to 0x00000003, meaning that this integrity policy denies READ and WRITE access attempts from processes with a lower Integrity Level than Medium, which is the integrity level of that object.
That’s the story of integrity level checks.
Refer back to the initial figure and double check that all makes sense now.
Privileges
The best way to introduce Privileges is with the official MSDN explanation:
- Privileges control access to system resources and system-related tasks, whereas access rights control access to securable objects.
- A system administrator assigns privileges to user and group accounts, whereas the system grants or denies access to a securable object based on the access rights granted in the ACEs in the object’s DACL.
Each system has an account database that stores the privileges held by user and group accounts. When a user logs on, the system produces an access token that contains a list of the user’s privileges, including those granted to the user or to groups to which the user belongs. Note that the privileges apply only to the local computer; A domain account can have different privileges on different computers.
Source: https://msdn.microsoft.com/en-us/library/windows/desktop/aa379306(v=vs.85).aspx
To enumerate what privileges your user has, simply run the following command and find the list of privileges at the end of the outputted result

Notice how the privileges expand once you run that command in a cmd started with “Run as administrator”:

To cross check or look up the privileges you got you can use the following MSDN resource:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb530716(v=vs.85).aspx
The sole purpose of User Access Control (UAC) is to have more fine-grained control over administrative execution and to prevent administrative users to use their admin execution rights when it’s not needed.
Recall from the introduction that by logging into your Windows computer your logon thread is assigned a user access token and all child processes launched by that user will inherit this token. For non-admin users this is a Medium Integrity token with your default privileges.
Prior to Windows Vista admin users got a high integrity token with all administrative privileges and each child processes launched would inherit this token. This meant that all processes spawned by an admin user would run with high privileges even if the process would not need those high privileges (e.g. the explorer.exe started by an admin would run with a high integrity token and full admin privileges without needing those privileges). UAC was introduced to fix this.
»Note: All of the following explanations assume that UAC is enabled and the administrative user we’re talking about is not the local RID-500er administrator (we get to that special case afterwards)
Since UAC was introduced in Windows Vista, when an admin logs in two access tokens are created:
- A Full Admin Token, also often referred to as ‘Non-filtered Token’ or ‘Full Token’, with high Integrity Level (IL) and all administrative privileges
- A filtered admin token, also often referred to as ‘Standard Token’ or ‘Restriced Token’, with medium integrity level (IL) and reduced privileges
These two tokens are linked together in the kernel, so that an executing thread could access both tokens if needed.
Now if an admin user logs into his account and launches cmd.exe this process will be spawned using the filtered, medium integrity token (remember: UAC is enabled and the user is not the RID-500 administrator). Thereby high access privileges are not given to processes that do not need those.
But in case the administrator user needs to run a process with full admin privileges he can ask the operating system to elevate this processes privileges with his full admin token, this is the ‘Run as administrator’-button. This will cause the prominent ‘consent’ prompt to pop up (C:\Windows\System32\consent.exe) as shown in the screenshot below:

By accepting this consent prompt, the system will create the elevated process (in this case cmd.exe) with full admin privileges, as it can be seen in the screenshot below:

The cmd.exe process (note that conhost.exe is the child processes created by cmd.exe) launched by the administrator without elevating is shown on the left and the elevated cmd.exe by hitting ‘Run as administrator’ is shown on the right.
Also compare the Integrity Levels and Privileges of these processes to determine which is which.
UAC for the RID-500er local Admin
All of the explanations above are only true for local or domain administrators that are not the RID-500er local admin. Each installation of Windows comes with a local Administrator account (which is disabled by default), that can be identified by the Relative Identifier (RID) of 500 (SID: S-1-5-21-DomainID—500).
The Story for the RID-500 local admin is that this account is not enrolled in UAC by default.
That means that if you log in to your Windows computer with the RID-500er local admin account you will be assigned a high privileged full access token right away (and don’t get a ‘filtered’ medium integrity token). If you run cmd.exe (or anything else) with the RID-500 local admin, even without specifying ‘Run as administrator’, then the cmd.exe will spawn with full administrative privileges and a high Integrity Level (because your only got a full token that the cmd.exe process can inherit). If you hit ‘Run as administrator’ with your RID-500er local admin there will be no consent prompt.
The RID-500er admin is by default not enrolled in UAC, but can be enrolled by setting the following registry key to ‘1’:
As shown in the following screenshot the FilterAdminstratorToken has been set to ‘1’ in this instance, which enrolls the RID-500er Admin in UAC (and thereby all of the rules mentioned previously would also apply for this user).

Disabling UAC For Non-RID-500er Admins
So by default the RID-500er Admin is not enrolled in UAC, but all other admins (meaning local or domain users that are in the administrative group) are enrolled in UAC.
Now as the RID-500er admin user can be enrolled in UAC, also the Non-RID-500er admins can be dis-enrolled from UAC, by setting the LocalAccountTokenFilterPolicy to ‘1’.
This registry key is not set by default, so if this key is missing all non RID-500er accounts are enrolled in UAC:

UAC and Remote Access
All of the above is true for local access, meaning your user locally logs into the computer and executes processes. Now for remote access there is another addition to the story.
The short version: For remote access (e.g. via wmic) domain administrators are given a full high integrity access token, but local Non-RID-500er admins will only be given a medium integrity restricted token.
Terming it the Microsoft way:
When a user who is a member of the local administrators group on the target remote computer establishes a remote administrative connection … they will not connect as a full administrator. The user has no elevation potential on the remote computer, and the user cannot perform administrative tasks. If the user wants to administer the workstation with a Security Account Manager (SAM) account, the user must interactively log on to the computer that is to be administered with Remote Assistance or Remote Desktop.
When a user with a domain user account logs on to a Windows Vista computer remotely, and the user is a member of the Administrators group, the domain user will run with a full administrator access token on the remote computer and UAC is disabled for the user on the remote computer for that session.
» This addition to UAC applies for remote administrative access, this does not affect Remote Desktop connections (which are considered as local logon).
UAC And Pass-the-Hash
Now comes the kicker.. Let’s face the following question:
Q: The following accounts try to establish a remote connection to a computer with default settings via a pth-attack (pass-the-hash) (using psexec or wmic).
Who will be able to establish a successful remote connection and why?
- a) The Local ‘Administrator’ — SID: S-1-5-21DomainID-500
- b) The Local user ‘LocalAdm’ who is member of the local Administrators Group (SID: S-1-5-32-544)
- c) The domain user ‘Lab\Frank’ who is a standard domain user without administrative privileges
- d) The domain user ‘Lab\Bob’ who is a member of the domain Administrators group
Be aware that remote access requires to launch high privileges processes and consider that there is no way to remotely elevate privileges.
And here’s why:
a) –> The local 500er Admin is not enrolled in UAC per default. The 500er admin receives a full access token per default and can establish a remote connection.
b) –> The non-500er local Admin is enrolled in UAC, but does not receive a full access token.
The full story here is: The non-500er admins tries to log in and gets a standard/medium access token. The remote connection access requires to start full token administrative access processes, which the user does not have (he/she got the medium token). Thereby his connection is refused.
c) –> Same story as for the non-500er local Admin. He/she gets a standard (medium) token and is rejected.
d) –> The domain admin is enrolled in UAC but gets automatically elevated. This is the exception that applies to remote access compared to local access.
The full story is: The domain admin, tries to log in, automatically receives a full/admin access token (instead of a standard/medium access token) and is able to get a remote shell.
If you’re still interested i also recommend a read over harmj0y’s blog post on Pass-the-Hash Is Dead: Long Live LocalAccountTokenFilterPolicy https://www.harmj0y.net/blog/redteaming/pass-the-hash-is-dead-long-live-localaccounttokenfilterpolicy/
Bonus Kicker: As mentioned before, the UAC remote rules do not apply for remote desktop connections. Therefore, if your user is part of the remote desktop user group you could also go for pass-the-hash via remote desktop, as described here: https://www.kali.org/penetration-testing/passing-hash-remote-desktop/
Access Tokens
So far when talking about basic access checks or UAC, user ‘access tokens’ were introduced. This access tokens hold information about the current user and the user’s groups and are for example used by the Security Reference Monitor (SRM) to determine who is requesting access.
These tokens are of major relevance for the access check and also play a role for certain privilege escalation attacks. Therefore it’s worth getting a closer look at access tokens.
So to start with there are only two kinds of token:
- Primary Tokens, which are assigned to processes; and
- Impersonation Tokens that are assigned to threads
Two kinds of tokens, that’s it. ‘Filtered tokens’, ‘Restricted Tokens’, ‘Full Tokens’, ‘Admin Tokens’, or in general ‘Access Tokens’, are just names given to describe the token, but all of these are Impersonation Tokens.
Both, primary and impersonation tokens, consist of the following major fields:
- User SID: the SID of the user (impersonation token) or the SID of the user that created the process (Primary token)
- Group SIDs: Group SIDs of the corresponding user (User SID)
- Logon SID: Identifies the current logon session
- Privileges: List of Privileges the User (impersonation token or process has)
- Primary Group SID: identifies the primary group of the impersonated user (impersonation token), e.g. ‘Domain Users’
- Default DACL: The default DACL that the system uses when a user creates a securable object without specifying a security descriptor (comparable to Linux umask)
- Type: Information if token is primary or impersonation
- Impersonation Level: The degree (level) of allowed impersonation.
- Integrity Level: SID of integrity level
- …
It is the token that is passed to the SRM to determine if a process has access to an object, therefore if you are able to obtain a high privileged token, you can escalate your privileges.
To get a hands on experience with tokens, James Forshaw develop the great tool Token Viewer (contained in the Sandbox-AttackSurface-Analysis-Tools), which is shown below:

In the right window a list of processes is shown. The token of one of the high integrity cmd.exe processes was opened and is shown in the left window. Notice that the token type is primary (because it’s a process) and the Integrity Level (IL) is set to High (because the cmd.exe process was started as elevated process by an admin).
Keep in mind that each process has a token assigned to it and this token is always a primary token.
Now let’s move to threads. Remember from the introduction that a user is assigned with a token once the user logs in and more precisely that means that the user’s logon thread is assigned with an impersonation token. A process can only have a primary token, but a thread can have an impersonation token as well as a primary token, in which case the impersonation token will always take primary over the primary token.
(… yep I know. Microsoft just sucks when it comes to naming things)
An example of an impersonation token is given below:

Notice that the token type now says ‘Impersonation’ and that now also the field ‘Impersonation Level’ is set to ‘Impersonation’. The impersonation level is an important field that influences if a token can be impersonated (more on this in the next section).
So far so good. The key take away here is that there are only two types of tokens for processes and threads.
Impersonation
The process of impersonation is quite important and frequently used in the Windows authorization process. To understand why impersonation is used we first must take a step back:
Imagine a user wants to delete a file on a remote file share. Now the server hosting the file needs to determine if the user is allowed to do that. The server can’t access the user’s access token because that token is not accessible in the remote server’s memory (the token is stored on the computer of the user requesting to delete the file). What the server could do is query the user’s account and group information from the Active Directory (AD) and check manually if the user is allowed to delete files, but this task is tedious and prone to errors. Therefore another approach was implemented and termed ‘Impersonation’.
The basic idea is that the server simply pretends to be the requesting user and carries out the requested action as if the server was the user. So what the server does is it duplicates the user’s Impersonation token and requests the action (e.g. delete a file) with that duplicated token (as if the server was the user).
Impersonation is a powerful feature, it enables a process to pretend to be someone else.
OK Million dollar idea: I just impersonate the token of a high privileged user and gain instant privilege escalation! … Nice thought, but obviously it cannot be that easy. There are two obstacles in the way:
- a) Not every impersonation token can be used to carry out actions
- b) You need special privileges to be able to ‘impersonate’ a token (which technically means duplicate a token)
The first obstacle is that not every token is actually ‘valuable’. What that means is that each impersonation token got an attribute called Impersonation Level, that can have one of the following values:
- Anonymous Level — the server can impersonate the client, but the token does not contain any information about the client. Anonymous level is only supported for inter process communication (e.g. for named pipes). All other transports silently promote this to ‘Identification Level’
- Identification Level — This is the default. The server can obtain the identity of the client in order to do ACL checks. You can use that token to read information about the impersonated user or check the resources ACL, but you can’t actually access that resource (read/write/execute)
- Impersonate Level — The server can impersonate the security context of the client in order to access local resources. If the server is local, it can access local and network resources. If the server is remote it can only access resources on the same machine as the server.
- Delegate Level — The most powerful impersonation level. The server can impersonate the security context of the client to access local or remote resources.
So what you want is an Impersonation or Delegation Level impersonation token to be able to actually do anything (a little more on this in the next section).
The second obstacle in your way is that you need special privileges in order to be able to duplicate (impersonate) another token. That special privilege is TOKEN_DUPLICATE (as specified in Access Rights for Access-Token Objects).
The plot twist here is that if you do not hold this privilege, your request to duplicate a token is not denied, you still get a duplicated token, but one with a lower Impersonation Level.
The flow of duplicating/impersonating another token is shown below:

So at the end of the day you either hold the TOKEN_DUPLICATE privilege (or compromised a process that holds this) or you end up with an Identification Level token, which is supposedly of no use to an attacker because you can’t carry out any action with that.
At this point we’re almost done with tokens. The following sections are meant to get you into the mind-set of privilege escalation attacks based on tokens…
Privilege Escalation With Identification Tokens
The previous section describes that it is pretty easy to obtain an identification token.
To once more underline the fact that this is true, I activated the local administrator account on my windows machine and used Forshaw’s Token Viewer tool, to impersonate the Administrators Impersonation token (for more details check out His 2015 BlackHat Talk):

I ran this tool with a standard non admin user, and still got access to the Administrators token. It feels odd, but based on the access check for duplicate tokens that was presented in the previous section, this is all as it should be.
Notice that I only gained an Identification Impersonation Token.
There should be not much that I can do with that token, especially not carry out administrative tasks or access protected resources…
… unless of course some programmers forget to check the Impersonation Level of the token that is presented for authorization checks. James Forshaw found that this happened for some windows components, which resulted in CVE-2015-0002 as shown for example in this PoC.
I highly recommend to review James 2015 BlackHat Talk to understand the full impact and application of this vulnerability, but the basic story for this was that a certain Windows component made an access check to verify if the presented impersonation token belongs to an Administrator, but the component only checked the Impersonation type and the associated groups and totally ignored the impersonation level, which resulted in access for any user that could present a high integrity identification token with administrative groups… Amazing finding!
Privilege Escalation By Leaky Tokens
Another privilege escalation vulnerability that Forshaw found is what he termed ‘Leaky Tokens’. The basic idea of this kind of vulnerability is as follows:
Kernel code can access any kind of token to read and manipulate it. So what if you found a Windows kernel component that just gives out tokens, that it had accessed, back to the user ?!
It sounds a bit too obvious that this is flawed, but Forshaw found that an undocumented win32k system call existed that passed a previously used token right back to the user.
Updates to the RecentDocs Key in Windows 10
I’ve been revisiting things in Windows 10 recently. We’ve seen a few things change that we have taken for granted in previous versions so I’ve been investigating things.
In my most recent efforts, I’ve come to the RecentDocs key in the Windows registry. For those that are unaware, this key lies in each user’s NTUSER.DAT file under their user profile. The path for the key is “NTUSER.DAT\Software\Microsoft\Windows\Current Version\Explorer\RecentDocs”. Under this key we see a list of recently accessed files (in hex) with a number assigned. Also in this key we have a Most Recently Used (MRU) list. This list gives the access order of the files. In the example below, we can see that the value MRUListEx starts with 33. When we convert this from hex we get 51, the item that is highlighted. The hex for item 51 would translate to the name of a file.

What you’ll also notice is that the RecentDocs key has subkeys for each extension too. Each of those contains their own MRUListEx for the specific extension as seen in the picture below.

So we have duplicate data. Files that appear in the top-level RecentDocs key, should also have an entry in their individual file extension subkey too. This means that a text file should appear in both RecentDocs and also RecentDocs\.txt. Note, that there is also a subkey specific to folders.
What is not shown in the screenshots above is the last-written dates and times associated with the keys. Why is this important? The last-written time has, historically, been used to determine when the most recent file in the MRUListEx value was accessed. For example, In the picture below, the MRUListEx shows 0x33 (51) as being the most recently accessed file. The last write timestamp for the RecentDocs key shows 2019-03-05 17:26:46. Meaning that the file at position 51 was last opened at that time.

This is the long-held belief anyway. The problem is that this isn’t necessarily true.
Take the following example. At 12:00pm I open a text file. An entry is added to the MRUListEx in both the RecentDocs key and the .txt file extension subkey. The last written time of both keys are also updated to/at that time. At 12:10pm I go into Registry Explorer and delete either another subkey (.docx for example), or a value referring to another file in the RecentDocs key, and what happens? The last write time for RecentDocs is updated. This now means that the text file is still the most recently accessed file in both MRUListEx lists (RecentDocs and .txt), but it now appears to have two last-accessed times, 12:00pm (from the .txt subkey) and 12:10pm (from the RecentDocs key). However, the file was never actually accessed at 12:10pm. Therefore, our trust in the date and time that the file was opened diminishes somewhat. In the pictures below, I provide another example. In the top picture you can see that the most recently used folder, under the RecentDocs key, was “testfolder6” with a last accessed 17:26:46. However, in the second picture, the Folder key tells us that the same folder was access at 17:16:44, not 17:26:46.

Which one is accurate? The Folder subkey. I purposely deleted another subkey belonging to a different file type and this behavior updated the last written time for the RecentDocs key.
Now, at this point, the RecentDocs key is “lying” to us. Well, not really, just our interpretation of the data is wrong, but you know what I mean. Is there anything we can do to make the Folder subkey lie to us too? Of course there is. We can just delete once of the values inside that subkey. So, if I delete value 0 in the picture above, the last-written time of the Folder subkey is updated. This means that we cannot rely on the last-written times of the RecentDocs key or any of its subkeys without verifying those accesses elsewhere.
Is this likely to happen? Maybe not, but this is something to watch for. Note that this is NOT a Windows 10 only issue. going back, this seems to affect all versions of Windows.
Now, Windows 10-specific items. What about how the RecentDocs keys are populated? Can we trust those? Well, it depends.
First, a slight detour. In Windows 10, if you right-click in explorer, select “New” and then select a file type, you get a new file. Surprising? No. But what else happens when you do this? A shortcut (lnk) file for that newly created file is automatically created in the user profile under the “Recent” folder. Not only that, but a shortcut file is also automatically created for the parent folder.
What about folders? Create a new folder and shortcut file is automatically generated for the folder you created, the parent folder and the grandparent folder. Go test it for yourself.
So why the detour to talk about shortcut files? Because the RecentDocs key now behaves in the exact same way. If you create a new file, an entry is made in the RecentDocs key and in the relevant extension’s subkey. This file does not have to be opened to generate these entries. In addition entries being created for the created file, entries are also created for the parent folder of the created file, assuming that those entries did not already exist for that folder.
The same goes for folder creation. Create a folder and the RecentDocs key creates an entry for the created folder, plus the parent folder (if an entry doesn’t already exist), and the grandparent folder (if an entry doesn’t already exist).
Pretty interesting, right? But what is perhaps more interesting is the order in which this happens. If you create a file or a folder, that entry goes into the RecentDocs key first, followed by the parent folder and, if applicable, the grandparent folder. This means that if you create the file “MyFolder\MyText.txt”, the last write time of the RecentDocs key will relate to the file creation, but the MRUListEx value will show “MyFolder” being the most recently used item, not “MyText.txt”. However, the .txt subkey will still show show “MyText.txt” as the most recently used txt file, and the last write time of the .txt subkey will still apply to that file.
Then, to make things more confusing, if you are not creating a file, but simply opening a file, similar behavior is seen. If I now go and open “MyText.txt” the RecentDocs key doesn’t show that file as the most recently accessed item, instead it shows the parent folder of “MyFolder”. This means that in most cases the item topping the RecentDocs MRUListEx value will be a folder, you’ll need to go to the subkeys for the file extension for the time relating to the files themselves.
Now, there is a caveat to this. This behavior doesn’t appear to occur when accessing files that exist directly on the Desktop, or on the user’s Documents folder. My initial thought is that this is due to them being shell folders. However, it continues to apply to subfolders.
Finally, just because I don’t know if anyone has ever addressed this, accessing two different items with the same name will not create separate RecentDocs entries. If I access MyText.txt from my Desktop and then open a completely different file named the same thing from my USB drive, there is only one entry in the RecentDocs key. The last write time for the .txt subkey will show when the file on the USB was accessed.
Hope this is useful to someone when you start seeing variances in the RecentDocs key.
EDIT: I forgot to mention that the RecentDocs\Folders subkey only ever seems to be populated when a child item is accessed (or when child folders are created as discussed above). The simple action of opening a folder does not populate this key.