Как работать с ключом SECP256K1 эллиптической кривой в хранилище ключей Azure, когда ключ также используется блокчейном - PullRequest
0 голосов
/ 29 ноября 2018

Мне интересно, как работать с ключами SECP256K1 в хранилище ключей Azure, когда в то же время ключ также требуется для создания учетной записи в блокчейне.

ЧТО ДОЛЖНО БЫТЬ ДОСТИГНУТОМ

  1. Создание пары ключей SECP256K1
  2. Использование открытого ключа для создания учетной записи в цепочке блоков
  3. Сохранение личного ключа в хранилище ключей и использование его для целей подписи

ПОПЫТКА № 1 - СОЗДАНИЕ ВНЕШНЕГО ХРАНИЛИЩА И ИМПОРТА

Я сгенерировал пару ключей SECP256K1 вне хранилища ключей.В результате у меня есть закрытый ключ и открытый ключ в виде строк.Моя идея состояла в том, чтобы импортировать закрытый ключ в хранилище ключей с помощью Azure SDK для .NET с помощью следующего фрагмента кода (используются значения ECParameters из пространства имен Microsoft.Azure.KeyVault.WebKey.ECParameters):

  //this part of code is taken from https://www.scottbrady91.com/C-Sharp/JWT-Signing-using-ECDSA-in-dotnet-Core
  var privateKeyBytes = Encoding.UTF8.GetBytes(privateKey);
  var privateKeyInt =
    new Org.BouncyCastle.Math.BigInteger(+1, privateKeyBytes);
  var parameters = SecNamedCurves.GetByName("secp256k1");
  var ecPoint = parameters.G.Multiply(privateKeyInt);
  var privateKeyX = ecPoint.Normalize().XCoord.ToBigInteger()
    .ToByteArrayUnsigned();
  var privateKeyY = ecPoint.Normalize().YCoord.ToBigInteger()
    .ToByteArrayUnsigned();

  //the following part is my code
  var ecParameters = new ECParameters();
  ecParameters.Curve = "P-256K";
  ecParameters.X = privateKeyX;
  ecParameters.Y = privateKeyY;
  ecParameters.D = privateKeyBytes;

  var key = new JsonWebKey(ecParameters);
  JsonWebKeyVerifier.Options options =
    JsonWebKeyVerifier.Options.DenyIncompatibleOperations
    | JsonWebKeyVerifier.Options.DenyExtraneousFields;
  string error = (string) null;

  JsonWebKeyVerifier.VerifyByKeyType(key, options, ref error);

  await client.ImportKeyWithHttpMessagesAsync(vaultBaseUri, name, key);

Результирующий ключ для импорта выглядит следующим образом (скопировано из представления переменных Visual Studio, может быть, его укорочено):

  {
    "kty": "EC",
    "crv": "P-256K",
    "x": "vSUHj6deEhPI6QeILgfgf2I7VTgmiDon_5nsss560OA",
    "y": "DK8DnzEOv57arN6f4Wou-vXkty7uje0n2xTHgGAehp8",
    "d": "NUpoaEEzWTFVYXBKNWZuRWZNUkVxZkpKY29LWGdMcHpFUnVNQ2E2Wjd0YkNhY2NpQ3N5"
  }

Хотя JsonWebKeyVerifier не возвращает ошибку и вызов key.IsValid () возвращает true, вызовСбой ключа хранилища с неверным запросом HTTP 400.Я включил ведение журнала на экземпляре Key Vault, и там появляется следующий журнал (идентификатор, имя пользователя, IP-адреса и GUID изменяются намеренно, я не уверен, что является конфиденциальным; я могу предоставить их по требованию):

{
  "time": "2018-11-28T16:28:05.2034585Z",
  "category": "AuditEvent",
  "operationName": "KeyImport",
  "resultType": "Success",
  "resultDescription": "EC key is not valid - cannot instantiate crypto service.",
  "correlationId": "5682a894-0150-484f-a398-6922efed4458",
  "callerIpAddress": "XX.XX.XXX.XXX",
  "identity": {
    "claim": {
      "http://schemas.microsoft.com/identity/claims/objectidentifier": "00000000-0000-0000-0000-000000000000",
      "appid": "00000000-0000-0000-0000-000000000000",
      "http://schemas.microsoft.com/identity/claims/scope": "user_impersonation",
      "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn": "xxx.xxxxxx@xxxxxxxx.com",
      "ipaddr": "XX.XX.XXX.XXX",
      "http://schemas.microsoft.com/claims/authnmethodsreferences": "pwd"
    }
  },
  "properties": {
    "id": "https://xxxxxxx.vault.azure.net/keys/testJK1",
    "clientInfo": "FxVersion/4.6.27019.06 OSName/Windows OSVersion/Microsoft.Windows.10.0.17134. Microsoft.Azure.KeyVault.KeyVaultClient/3.0.2.0",
    "httpStatusCode": 400,
    "requestUri": "https://xxxxxxxx.vault.azure.net/keys/testJK1?api-version=7.0",
    "isAccessPolicyMatch": true,
    "keyProperties": {
      "type": "EC"
    }
  },
  "resourceId": "/SUBSCRIPTIONS/00000000-0000-0000-0000-000000000000/RESOURCEGROUPS/XXXXXX-RG/PROVIDERS/MICROSOFT.KEYVAULT/VAULTS/XXXXXXX",
  "operationVersion": "7.0",
  "resultSignature": "Bad Request",
  "durationMs": "259"
}

ПОПЫТКА № 2 - СОЗДАТЬ В КЛЮЧЕВОЙ ХРАНИЛИЩЕ И ЭКСПОРТЕ

Даже если я могу сгенерировать ключ SECP256K1 EC в Key Vault, я не нашел, как экспортировать его открытыйключевая часть.

РЕДАКТИРОВАТЬ 11/23/2018

Метод GetKey в хранилище ключей Azure возвращает JsonWebKey, содержащий координаты X и Y.

ВОПРОСЫ

  1. Можно ли импортировать ключ SECP256K1 через Azure SDK для .NET?Если да, не могли бы вы дать мне ссылку на рабочий пример?
  2. Я делаю что-то неправильно или недостаточно в моем коде при попытке импортировать ключ в Key Vault?
  3. Можно ли экспортироватьОткрытый ключ SECP256K1 от хранилища ключей?
  4. Есть ли у вас какие-либо другие идеи о том, как выполнить достижения, описанные здесь ранее?

РЕДАКТИРОВАТЬ 11/29/2018

Есть ли способ, как построить открытый ключ из координат X и Y (в идеале в мире .NET)?

Заранее спасибо.

С уважением, Ян

PS: я первоначально разместил этот вопрос в блоге Azure Key Vault , но здесь, вероятно, гораздо более широкая аудитория.Я свяжу оба источника, как только будет дан ответ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...