[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JN38GV1S4CPM6AYRN2AF3R":3,"skill-same:01M6JN38GV1S4CPM6AYRN2AF3R":92},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":53,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":6,"updatedAt":56,"install":57,"resources":70},"01M6JN38GV1S4CPM6AYRN2AF3R","azure_security_keyvault_keys_java",null,"Azure Key Vault Keys Java SDK for cryptographic key management. Use when creating, managing, or using RSA\u002FEC keys, performing encrypt\u002Fdecrypt\u002Fsign\u002Fverify operations, or working with HSM-backed keys.","LongLeo287\u002FOmniClaw","LongLeo287","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F141803367?v=4","01M6JK75C62VCNZKR5BRZ386YV","LongLeo","01M6JK75GQ78TSP1ZPXNKK3MCH",9,"MIT","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fazure_security_keyvault_keys_java\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"security","azure","azure security keyvault keys java","java","keys","azure security","for","sdk","with","key management","ec","azure key vault","use","operations","verify","azure-security","vault","rsa","hsm","encrypt","2026-11-10 10:12:30",false,"---\nname: azure_security_keyvault_keys_java\n\ndescription: Azure Key Vault Keys Java SDK for cryptographic key management. Use when creating, managing, or using RSA\u002FEC keys, performing encrypt\u002Fdecrypt\u002Fsign\u002Fverify operations, or working with HSM-backed keys.\nlicense: MIT\nmetadata:\n  author: Microsoft\n  version: \"1.0.0\"\n  package: com.azure:azure-security-keyvault-keys\n---\n\n# Azure Key Vault Keys (Java)\n\nManage cryptographic keys and perform cryptographic operations in Azure Key Vault and Managed HSM.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-security-keyvault-keys\u003C\u002FartifactId>\n    \u003Cversion>4.9.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Client Creation\n\n```java\nimport com.azure.security.keyvault.keys.KeyClient;\nimport com.azure.security.keyvault.keys.KeyClientBuilder;\nimport com.azure.security.keyvault.keys.cryptography.CryptographyClient;\nimport com.azure.security.keyvault.keys.cryptography.CryptographyClientBuilder;\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\n\u002F\u002F Key management client\nKeyClient keyClient = new KeyClientBuilder()\n    .vaultUrl(\"https:\u002F\u002F\u003Cvault-name>.vault.azure.net\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n\n\u002F\u002F Async client\nKeyAsyncClient keyAsyncClient = new KeyClientBuilder()\n    .vaultUrl(\"https:\u002F\u002F\u003Cvault-name>.vault.azure.net\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildAsyncClient();\n\n\u002F\u002F Cryptography client (for encrypt\u002Fdecrypt\u002Fsign\u002Fverify)\nCryptographyClient cryptoClient = new CryptographyClientBuilder()\n    .keyIdentifier(\"https:\u002F\u002F\u003Cvault-name>.vault.azure.net\u002Fkeys\u002F\u003Ckey-name>\u002F\u003Ckey-version>\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n```\n\n## Key Types\n\n| Type | Description |\n|------|-------------|\n| `RSA` | RSA key (2048, 3072, 4096 bits) |\n| `RSA_HSM` | RSA key in HSM |\n| `EC` | Elliptic Curve key |\n| `EC_HSM` | Elliptic Curve key in HSM |\n| `OCT` | Symmetric key (Managed HSM only) |\n| `OCT_HSM` | Symmetric key in HSM |\n\n## Create Keys\n\n### Create RSA Key\n\n```java\nimport com.azure.security.keyvault.keys.models.*;\n\n\u002F\u002F Simple RSA key\nKeyVaultKey rsaKey = keyClient.createRsaKey(new CreateRsaKeyOptions(\"my-rsa-key\")\n    .setKeySize(2048));\n\nSystem.out.println(\"Key name: \" + rsaKey.getName());\nSystem.out.println(\"Key ID: \" + rsaKey.getId());\nSystem.out.println(\"Key type: \" + rsaKey.getKeyType());\n\n\u002F\u002F RSA key with options\nKeyVaultKey rsaKeyWithOptions = keyClient.createRsaKey(new CreateRsaKeyOptions(\"my-rsa-key-2\")\n    .setKeySize(4096)\n    .setExpiresOn(OffsetDateTime.now().plusYears(1))\n    .setNotBefore(OffsetDateTime.now())\n    .setEnabled(true)\n    .setKeyOperations(KeyOperation.ENCRYPT, KeyOperation.DECRYPT, \n                       KeyOperation.WRAP_KEY, KeyOperation.UNWRAP_KEY)\n    .setTags(Map.of(\"environment\", \"production\")));\n\n\u002F\u002F HSM-backed RSA key\nKeyVaultKey hsmKey = keyClient.createRsaKey(new CreateRsaKeyOptions(\"my-hsm-key\")\n    .setKeySize(2048)\n    .setHardwareProtected(true));\n```\n\n### Create EC Key\n\n```java\n\u002F\u002F EC key with P-256 curve\nKeyVaultKey ecKey = keyClient.createEcKey(new CreateEcKeyOptions(\"my-ec-key\")\n    .setCurveName(KeyCurveName.P_256));\n\n\u002F\u002F EC key with other curves\nKeyVaultKey ecKey384 = keyClient.createEcKey(new CreateEcKeyOptions(\"my-ec-key-384\")\n    .setCurveName(KeyCurveName.P_384));\n\nKeyVaultKey ecKey521 = keyClient.createEcKey(new CreateEcKeyOptions(\"my-ec-key-521\")\n    .setCurveName(KeyCurveName.P_521));\n\n\u002F\u002F HSM-backed EC key\nKeyVaultKey ecHsmKey = keyClient.createEcKey(new CreateEcKeyOptions(\"my-ec-hsm-key\")\n    .setCurveName(KeyCurveName.P_256)\n    .setHardwareProtected(true));\n```\n\n### Create Symmetric Key (Managed HSM only)\n\n```java\nKeyVaultKey octKey = keyClient.createOctKey(new CreateOctKeyOptions(\"my-symmetric-key\")\n    .setKeySize(256)\n    .setHardwareProtected(true));\n```\n\n## Get Key\n\n```java\n\u002F\u002F Get latest version\nKeyVaultKey key = keyClient.getKey(\"my-key\");\n\n\u002F\u002F Get specific version\nKeyVaultKey keyVersion = keyClient.getKey(\"my-key\", \"\u003Cversion-id>\");\n\n\u002F\u002F Get only key properties (no key material)\nKeyProperties keyProps = keyClient.getKey(\"my-key\").getProperties();\n```\n\n## Update Key Properties\n\n```java\nKeyVaultKey key = keyClient.getKey(\"my-key\");\n\n\u002F\u002F Update properties\nkey.getProperties()\n    .setEnabled(false)\n    .setExpiresOn(OffsetDateTime.now().plusMonths(6))\n    .setTags(Map.of(\"status\", \"archived\"));\n\nKeyVaultKey updatedKey = keyClient.updateKeyProperties(key.getProperties(),\n    KeyOperation.ENCRYPT, KeyOperation.DECRYPT);\n```\n\n## List Keys\n\n```java\nimport com.azure.core.util.paging.PagedIterable;\n\n\u002F\u002F List all keys\nfor (KeyProperties keyProps : keyClient.listPropertiesOfKeys()) {\n    System.out.println(\"Key: \" + keyProps.getName());\n    System.out.println(\"  Enabled: \" + keyProps.isEnabled());\n    System.out.println(\"  Created: \" + keyProps.getCreatedOn());\n}\n\n\u002F\u002F List key versions\nfor (KeyProperties version : keyClient.listPropertiesOfKeyVersions(\"my-key\")) {\n    System.out.println(\"Version: \" + version.getVersion());\n    System.out.println(\"Created: \" + version.getCreatedOn());\n}\n```\n\n## Delete Key\n\n```java\nimport com.azure.core.util.polling.SyncPoller;\n\n\u002F\u002F Begin delete (soft-delete enabled vaults)\nSyncPoller\u003CDeletedKey, Void> deletePoller = keyClient.beginDeleteKey(\"my-key\");\n\n\u002F\u002F Wait for deletion\nDeletedKey deletedKey = deletePoller.poll().getValue();\nSystem.out.println(\"Deleted: \" + deletedKey.getDeletedOn());\n\ndeletePoller.waitForCompletion();\n\n\u002F\u002F Purge deleted key (permanent deletion)\nkeyClient.purgeDeletedKey(\"my-key\");\n\n\u002F\u002F Recover deleted key\nSyncPoller\u003CKeyVaultKey, Void> recoverPoller = keyClient.beginRecoverDeletedKey(\"my-key\");\nrecoverPoller.waitForCompletion();\n```\n\n## Cryptographic Operations\n\n### Encrypt\u002FDecrypt\n\n```java\nimport com.azure.security.keyvault.keys.cryptography.models.*;\n\nCryptographyClient cryptoClient = new CryptographyClientBuilder()\n    .keyIdentifier(\"https:\u002F\u002F\u003Cvault>.vault.azure.net\u002Fkeys\u002F\u003Ckey-name>\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n\nbyte[] plaintext = \"Hello, World!\".getBytes(StandardCharsets.UTF_8);\n\n\u002F\u002F Encrypt\nEncryptResult encryptResult = cryptoClient.encrypt(EncryptionAlgorithm.RSA_OAEP, plaintext);\nbyte[] ciphertext = encryptResult.getCipherText();\nSystem.out.println(\"Ciphertext length: \" + ciphertext.length);\n\n\u002F\u002F Decrypt\nDecryptResult decryptResult = cryptoClient.decrypt(EncryptionAlgorithm.RSA_OAEP, ciphertext);\nString decrypted = new String(decryptResult.getPlainText(), StandardCharsets.UTF_8);\nSystem.out.println(\"Decrypted: \" + decrypted);\n```\n\n### Sign\u002FVerify\n\n```java\nimport java.security.MessageDigest;\n\n\u002F\u002F Create digest of data\nbyte[] data = \"Data to sign\".getBytes(StandardCharsets.UTF_8);\nMessageDigest md = MessageDigest.getInstance(\"SHA-256\");\nbyte[] digest = md.digest(data);\n\n\u002F\u002F Sign\nSignResult signResult = cryptoClient.sign(SignatureAlgorithm.RS256, digest);\nbyte[] signature = signResult.getSignature();\n\n\u002F\u002F Verify\nVerifyResult verifyResult = cryptoClient.verify(SignatureAlgorithm.RS256, digest, signature);\nSystem.out.println(\"Valid signature: \" + verifyResult.isValid());\n```\n\n### Wrap\u002FUnwrap Key\n\n```java\n\u002F\u002F Key to wrap (e.g., AES key)\nbyte[] keyToWrap = new byte[32];  \u002F\u002F 256-bit key\nnew SecureRandom().nextBytes(keyToWrap);\n\n\u002F\u002F Wrap\nWrapResult wrapResult = cryptoClient.wrapKey(KeyWrapAlgorithm.RSA_OAEP, keyToWrap);\nbyte[] wrappedKey = wrapResult.getEncryptedKey();\n\n\u002F\u002F Unwrap\nUnwrapResult unwrapResult = cryptoClient.unwrapKey(KeyWrapAlgorithm.RSA_OAEP, wrappedKey);\nbyte[] unwrappedKey = unwrapResult.getKey();\n```\n\n## Backup and Restore\n\n```java\n\u002F\u002F Backup\nbyte[] backup = keyClient.backupKey(\"my-key\");\n\n\u002F\u002F Save backup to file\nFiles.write(Paths.get(\"key-backup.blob\"), backup);\n\n\u002F\u002F Restore\nbyte[] backupData = Files.readAllBytes(Paths.get(\"key-backup.blob\"));\nKeyVaultKey restoredKey = keyClient.restoreKeyBackup(backupData);\n```\n\n## Key Rotation\n\n```java\n\u002F\u002F Rotate to new version\nKeyVaultKey rotatedKey = keyClient.rotateKey(\"my-key\");\nSystem.out.println(\"New version: \" + rotatedKey.getProperties().getVersion());\n\n\u002F\u002F Set rotation policy\nKeyRotationPolicy policy = new KeyRotationPolicy()\n    .setExpiresIn(\"P90D\")  \u002F\u002F Expire after 90 days\n    .setLifetimeActions(Arrays.asList(\n        new KeyRotationLifetimeAction(KeyRotationPolicyAction.ROTATE)\n            .setTimeBeforeExpiry(\"P30D\")));  \u002F\u002F Rotate 30 days before expiry\n\nkeyClient.updateKeyRotationPolicy(\"my-key\", policy);\n\n\u002F\u002F Get rotation policy\nKeyRotationPolicy currentPolicy = keyClient.getKeyRotationPolicy(\"my-key\");\n```\n\n## Import Key\n\n```java\nimport com.azure.security.keyvault.keys.models.ImportKeyOptions;\nimport com.azure.security.keyvault.keys.models.JsonWebKey;\n\n\u002F\u002F Import existing key material\nJsonWebKey jsonWebKey = new JsonWebKey()\n    .setKeyType(KeyType.RSA)\n    .setN(modulus)\n    .setE(exponent)\n    .setD(privateExponent)\n    \u002F\u002F ... other RSA components\n    ;\n\nImportKeyOptions importOptions = new ImportKeyOptions(\"imported-key\", jsonWebKey)\n    .setHardwareProtected(false);\n\nKeyVaultKey importedKey = keyClient.importKey(importOptions);\n```\n\n## Encryption Algorithms\n\n| Algorithm | Key Type | Description |\n|-----------|----------|-------------|\n| `RSA1_5` | RSA | RSAES-PKCS1-v1_5 |\n| `RSA_OAEP` | RSA | RSAES with OAEP (recommended) |\n| `RSA_OAEP_256` | RSA | RSAES with OAEP using SHA-256 |\n| `A128GCM` | OCT | AES-GCM 128-bit |\n| `A256GCM` | OCT | AES-GCM 256-bit |\n| `A128CBC` | OCT | AES-CBC 128-bit |\n| `A256CBC` | OCT | AES-CBC 256-bit |\n\n## Signature Algorithms\n\n| Algorithm | Key Type | Hash |\n|-----------|----------|------|\n| `RS256` | RSA | SHA-256 |\n| `RS384` | RSA | SHA-384 |\n| `RS512` | RSA | SHA-512 |\n| `PS256` | RSA | SHA-256 (PSS) |\n| `ES256` | EC P-256 | SHA-256 |\n| `ES384` | EC P-384 | SHA-384 |\n| `ES512` | EC P-521 | SHA-512 |\n\n## Error Handling\n\n```java\nimport com.azure.core.exception.HttpResponseException;\nimport com.azure.core.exception.ResourceNotFoundException;\n\ntry {\n    KeyVaultKey key = keyClient.getKey(\"non-existent-key\");\n} catch (ResourceNotFoundException e) {\n    System.out.println(\"Key not found: \" + e.getMessage());\n} catch (HttpResponseException e) {\n    System.out.println(\"HTTP error \" + e.getResponse().getStatusCode());\n    System.out.println(\"Message: \" + e.getMessage());\n}\n```\n\n## Environment Variables\n\n```bash\nAZURE_KEYVAULT_URL=https:\u002F\u002F\u003Cvault-name>.vault.azure.net\n```\n\n## Best Practices\n\n1. **Use HSM Keys for Production** - Set `setHardwareProtected(true)` for sensitive keys\n2. **Enable Soft Delete** - Protects against accidental deletion\n3. **Key Rotation** - Set up automatic rotation policies\n4. **Least Privilege** - Use separate keys for different operations\n5. **Local Crypto When Possible** - Use `CryptographyClient` with local key material to reduce round-trips\n\n## Trigger Phrases\n\n- \"Key Vault keys Java\", \"cryptographic keys Java\"\n- \"encrypt decrypt Java\", \"sign verify Java\"\n- \"RSA key\", \"EC key\", \"HSM key\"\n- \"key rotation\", \"wrap unwrap key\"\n","# Azure Key Vault Keys (Java)\n\nManage cryptographic keys and perform cryptographic operations in Azure Key Vault and Managed HSM.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-security-keyvault-keys\u003C\u002FartifactId>\n    \u003Cversion>4.9.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Client Creation\n\n```java\nimport com.azure.security.keyvault.keys.KeyClient;\nimport com.azure.security.keyvault.keys.KeyClientBuilder;\nimport com.azure.security.keyvault.keys.cryptography.CryptographyClient;\nimport com.azure.security.keyvault.keys.cryptography.CryptographyClientBuilder;\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\n\u002F\u002F Key management client\nKeyClient keyClient = new KeyClientBuilder()\n    .vaultUrl(\"https:\u002F\u002F\u003Cvault-name>.vault.azure.net\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n\n\u002F\u002F Async client\nKeyAsyncClient keyAsyncClient = new KeyClientBuilder()\n    .vaultUrl(\"https:\u002F\u002F\u003Cvault-name>.vault.azure.net\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildAsyncClient();\n\n\u002F\u002F Cryptography client (for encrypt\u002Fdecrypt\u002Fsign\u002Fverify)\nCryptographyClient cryptoClient = new CryptographyClientBuilder()\n    .keyIdentifier(\"https:\u002F\u002F\u003Cvault-name>.vault.azure.net\u002Fkeys\u002F\u003Ckey-name>\u002F\u003Ckey-version>\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n```\n\n## Key Types\n\n| Type | Description |\n|------|-------------|\n| `RSA` | RSA key (2048, 3072, 4096 bits) |\n| `RSA_HSM` | RSA key in HSM |\n| `EC` | Elliptic Curve key |\n| `EC_HSM` | Elliptic Curve key in HSM |\n| `OCT` | Symmetric key (Managed HSM only) |\n| `OCT_HSM` | Symmetric key in HSM |\n\n## Create Keys\n\n### Create RSA Key\n\n```java\nimport com.azure.security.keyvault.keys.models.*;\n\n\u002F\u002F Simple RSA key\nKeyVaultKey rsaKey = keyClient.createRsaKey(new CreateRsaKeyOptions(\"my-rsa-key\")\n    .setKeySize(2048));\n\nSystem.out.println(\"Key name: \" + rsaKey.getName());\nSystem.out.println(\"Key ID: \" + rsaKey.getId());\nSystem.out.println(\"Key type: \" + rsaKey.getKeyType());\n\n\u002F\u002F RSA key with options\nKeyVaultKey rsaKeyWithOptions = keyClient.createRsaKey(new CreateRsaKeyOptions(\"my-rsa-key-2\")\n    .setKeySize(4096)\n    .setExpiresOn(OffsetDateTime.now().plusYears(1))\n    .setNotBefore(OffsetDateTime.now())\n    .setEnabled(true)\n    .setKeyOperations(KeyOperation.ENCRYPT, KeyOperation.DECRYPT, \n                       KeyOperation.WRAP_KEY, KeyOperation.UNWRAP_KEY)\n    .setTags(Map.of(\"environment\", \"production\")));\n\n\u002F\u002F HSM-backed RSA key\nKeyVaultKey hsmKey = keyClient.createRsaKey(new CreateRsaKeyOptions(\"my-hsm-key\")\n    .setKeySize(2048)\n    .setHardwareProtected(true));\n```\n\n### Create EC Key\n\n```java\n\u002F\u002F EC key with P-256 curve\nKeyVaultKey ecKey = keyClient.createEcKey(new CreateEcKeyOptions(\"my-ec-key\")\n    .setCurveName(KeyCurveName.P_256));\n\n\u002F\u002F EC key with other curves\nKeyVaultKey ecKey384 = keyClient.createEcKey(new CreateEcKeyOptions(\"my-ec-key-384\")\n    .setCurveName(KeyCurveName.P_384));\n\nKeyVaultKey ecKey521 = keyClient.createEcKey(new CreateEcKeyOptions(\"my-ec-key-521\")\n    .setCurveName(KeyCurveName.P_521));\n\n\u002F\u002F HSM-backed EC key\nKeyVaultKey ecHsmKey = keyClient.createEcKey(new CreateEcKeyOptions(\"my-ec-hsm-key\")\n    .setCurveName(KeyCurveName.P_256)\n    .setHardwareProtected(true));\n```\n\n### Create Symmetric Key (Managed HSM only)\n\n```java\nKeyVaultKey octKey = keyClient.createOctKey(new CreateOctKeyOptions(\"my-symmetric-key\")\n    .setKeySize(256)\n    .setHardwareProtected(true));\n```\n\n## Get Key\n\n```java\n\u002F\u002F Get latest version\nKeyVaultKey key = keyClient.getKey(\"my-key\");\n\n\u002F\u002F Get specific version\nKeyVaultKey keyVersion = keyClient.getKey(\"my-key\", \"\u003Cversion-id>\");\n\n\u002F\u002F Get only key properties (no key material)\nKeyProperties keyProps = keyClient.getKey(\"my-key\").getProperties();\n```\n\n## Update Key Properties\n\n```java\nKeyVaultKey key = keyClient.getKey(\"my-key\");\n\n\u002F\u002F Update properties\nkey.getProperties()\n    .setEnabled(false)\n    .setExpiresOn(OffsetDateTime.now().plusMonths(6))\n    .setTags(Map.of(\"status\", \"archived\"));\n\nKeyVaultKey updatedKey = keyClient.updateKeyProperties(key.getProperties(),\n    KeyOperation.ENCRYPT, KeyOperation.DECRYPT);\n```\n\n## List Keys\n\n```java\nimport com.azure.core.util.paging.PagedIterable;\n\n\u002F\u002F List all keys\nfor (KeyProperties keyProps : keyClient.listPropertiesOfKeys()) {\n    System.out.println(\"Key: \" + keyProps.getName());\n    System.out.println(\"  Enabled: \" + keyProps.isEnabled());\n    System.out.println(\"  Created: \" + keyProps.getCreatedOn());\n}\n\n\u002F\u002F List key versions\nfor (KeyProperties version : keyClient.listPropertiesOfKeyVersions(\"my-key\")) {\n    System.out.println(\"Version: \" + version.getVersion());\n    System.out.println(\"Created: \" + version.getCreatedOn());\n}\n```\n\n## Delete Key\n\n```java\nimport com.azure.core.util.polling.SyncPoller;\n\n\u002F\u002F Begin delete (soft-delete enabled vaults)\nSyncPoller\u003CDeletedKey, Void> deletePoller = keyClient.beginDeleteKey(\"my-key\");\n\n\u002F\u002F Wait for deletion\nDeletedKey deletedKey = deletePoller.poll().getValue();\nSystem.out.println(\"Deleted: \" + deletedKey.getDeletedOn());\n\ndeletePoller.waitForCompletion();\n\n\u002F\u002F Purge deleted key (permanent deletion)\nkeyClient.purgeDeletedKey(\"my-key\");\n\n\u002F\u002F Recover deleted key\nSyncPoller\u003CKeyVaultKey, Void> recoverPoller = keyClient.beginRecoverDeletedKey(\"my-key\");\nrecoverPoller.waitForCompletion();\n```\n\n## Cryptographic Operations\n\n### Encrypt\u002FDecrypt\n\n```java\nimport com.azure.security.keyvault.keys.cryptography.models.*;\n\nCryptographyClient cryptoClient = new CryptographyClientBuilder()\n    .keyIdentifier(\"https:\u002F\u002F\u003Cvault>.vault.azure.net\u002Fkeys\u002F\u003Ckey-name>\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n\nbyte[] plaintext = \"Hello, World!\".getBytes(StandardCharsets.UTF_8);\n\n\u002F\u002F Encrypt\nEncryptResult encryptResult = cryptoClient.encrypt(EncryptionAlgorithm.RSA_OAEP, plaintext);\nbyte[] ciphertext = encryptResult.getCipherText();\nSystem.out.println(\"Ciphertext length: \" + ciphertext.length);\n\n\u002F\u002F Decrypt\nDecryptResult decryptResult = cryptoClient.decrypt(EncryptionAlgorithm.RSA_OAEP, ciphertext);\nString decrypted = new String(decryptResult.getPlainText(), StandardCharsets.UTF_8);\nSystem.out.println(\"Decrypted: \" + decrypted);\n```\n\n### Sign\u002FVerify\n\n```java\nimport java.security.MessageDigest;\n\n\u002F\u002F Create digest of data\nbyte[] data = \"Data to sign\".getBytes(StandardCharsets.UTF_8);\nMessageDigest md = MessageDigest.getInstance(\"SHA-256\");\nbyte[] digest = md.digest(data);\n\n\u002F\u002F Sign\nSignResult signResult = cryptoClient.sign(SignatureAlgorithm.RS256, digest);\nbyte[] signature = signResult.getSignature();\n\n\u002F\u002F Verify\nVerifyResult verifyResult = cryptoClient.verify(SignatureAlgorithm.RS256, digest, signature);\nSystem.out.println(\"Valid signature: \" + verifyResult.isValid());\n```\n\n### Wrap\u002FUnwrap Key\n\n```java\n\u002F\u002F Key to wrap (e.g., AES key)\nbyte[] keyToWrap = new byte[32];  \u002F\u002F 256-bit key\nnew SecureRandom().nextBytes(keyToWrap);\n\n\u002F\u002F Wrap\nWrapResult wrapResult = cryptoClient.wrapKey(KeyWrapAlgorithm.RSA_OAEP, keyToWrap);\nbyte[] wrappedKey = wrapResult.getEncryptedKey();\n\n\u002F\u002F Unwrap\nUnwrapResult unwrapResult = cryptoClient.unwrapKey(KeyWrapAlgorithm.RSA_OAEP, wrappedKey);\nbyte[] unwrappedKey = unwrapResult.getKey();\n```\n\n## Backup and Restore\n\n```java\n\u002F\u002F Backup\nbyte[] backup = keyClient.backupKey(\"my-key\");\n\n\u002F\u002F Save backup to file\nFiles.write(Paths.get(\"key-backup.blob\"), backup);\n\n\u002F\u002F Restore\nbyte[] backupData = Files.readAllBytes(Paths.get(\"key-backup.blob\"));\nKeyVaultKey restoredKey = keyClient.restoreKeyBackup(backupData);\n```\n\n## Key Rotation\n\n```java\n\u002F\u002F Rotate to new version\nKeyVaultKey rotatedKey = keyClient.rotateKey(\"my-key\");\nSystem.out.println(\"New version: \" + rotatedKey.getProperties().getVersion());\n\n\u002F\u002F Set rotation policy\nKeyRotationPolicy policy = new KeyRotationPolicy()\n    .setExpiresIn(\"P90D\")  \u002F\u002F Expire after 90 days\n    .setLifetimeActions(Arrays.asList(\n        new KeyRotationLifetimeAction(KeyRotationPolicyAction.ROTATE)\n            .setTimeBeforeExpiry(\"P30D\")));  \u002F\u002F Rotate 30 days before expiry\n\nkeyClient.updateKeyRotationPolicy(\"my-key\", policy);\n\n\u002F\u002F Get rotation policy\nKeyRotationPolicy currentPolicy = keyClient.getKeyRotationPolicy(\"my-key\");\n```\n\n## Import Key\n\n```java\nimport com.azure.security.keyvault.keys.models.ImportKeyOptions;\nimport com.azure.security.keyvault.keys.models.JsonWebKey;\n\n\u002F\u002F Import existing key material\nJsonWebKey jsonWebKey = new JsonWebKey()\n    .setKeyType(KeyType.RSA)\n    .setN(modulus)\n    .setE(exponent)\n    .setD(privateExponent)\n    \u002F\u002F ... other RSA components\n    ;\n\nImportKeyOptions importOptions = new ImportKeyOptions(\"imported-key\", jsonWebKey)\n    .setHardwareProtected(false);\n\nKeyVaultKey importedKey = keyClient.importKey(importOptions);\n```\n\n## Encryption Algorithms\n\n| Algorithm | Key Type | Description |\n|-----------|----------|-------------|\n| `RSA1_5` | RSA | RSAES-PKCS1-v1_5 |\n| `RSA_OAEP` | RSA | RSAES with OAEP (recommended) |\n| `RSA_OAEP_256` | RSA | RSAES with OAEP using SHA-256 |\n| `A128GCM` | OCT | AES-GCM 128-bit |\n| `A256GCM` | OCT | AES-GCM 256-bit |\n| `A128CBC` | OCT | AES-CBC 128-bit |\n| `A256CBC` | OCT | AES-CBC 256-bit |\n\n## Signature Algorithms\n\n| Algorithm | Key Type | Hash |\n|-----------|----------|------|\n| `RS256` | RSA | SHA-256 |\n| `RS384` | RSA | SHA-384 |\n| `RS512` | RSA | SHA-512 |\n| `PS256` | RSA | SHA-256 (PSS) |\n| `ES256` | EC P-256 | SHA-256 |\n| `ES384` | EC P-384 | SHA-384 |\n| `ES512` | EC P-521 | SHA-512 |\n\n## Error Handling\n\n```java\nimport com.azure.core.exception.HttpResponseException;\nimport com.azure.core.exception.ResourceNotFoundException;\n\ntry {\n    KeyVaultKey key = keyClient.getKey(\"non-existent-key\");\n} catch (ResourceNotFoundException e) {\n    System.out.println(\"Key not found: \" + e.getMessage());\n} catch (HttpResponseException e) {\n    System.out.println(\"HTTP error \" + e.getResponse().getStatusCode());\n    System.out.println(\"Message: \" + e.getMessage());\n}\n```\n\n## Environment Variables\n\n```bash\nAZURE_KEYVAULT_URL=https:\u002F\u002F\u003Cvault-name>.vault.azure.net\n```\n\n## Best Practices\n\n1. **Use HSM Keys for Production** - Set `setHardwareProtected(true)` for sensitive keys\n2. **Enable Soft Delete** - Protects against accidental deletion\n3. **Key Rotation** - Set up automatic rotation policies\n4. **Least Privilege** - Use separate keys for different operations\n5. **Local Crypto When Possible** - Use `CryptographyClient` with local key material to reduce round-trips\n\n## Trigger Phrases\n\n- \"Key Vault keys Java\", \"cryptographic keys Java\"\n- \"encrypt decrypt Java\", \"sign verify Java\"\n- \"RSA key\", \"EC key\", \"HSM key\"\n- \"key rotation\", \"wrap unwrap key\"\n",{"name":5,"license":15,"metadata":44,"description":7},{"author":45,"package":46,"version":47},"Microsoft","com.azure:azure-security-keyvault-keys","1.0.0","main","c173cdffe08e788a99b91928a831b476b8434838","ecosystem\u002Fskills\u002Fazure_security_keyvault_keys_java",0,"https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw","https:\u002F\u002Fportfolio-longleo.vercel.app\u002Flabs\u002Fomniclaw.html","https:\u002F\u002Fgithub.com\u002FLongLeo287","https:\u002F\u002Fwww.facebook.com\u002FResourceRookie2023","2026-09-30 00:58:05",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add LongLeo287\u002FOmniClaw --skill azure_security_keyvault_keys_java",{"tool":63,"command":64},"bunx","bunx skills add LongLeo287\u002FOmniClaw --skill azure_security_keyvault_keys_java",{"tool":66,"command":67},"pnpm","pnpm dlx skills add LongLeo287\u002FOmniClaw --skill azure_security_keyvault_keys_java","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fazure_security_keyvault_keys_java\u002FSKILL.md",true,[71,77,81,85,89],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"_DIR_IDENTITY.md","REFERENCE","参考文档",188,"https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fazure_security_keyvault_keys_java\u002F_DIR_IDENTITY.md",{"path":78,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":79,"sourceHtmlUrl":80},"README.md",501,"https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fazure_security_keyvault_keys_java\u002FREADME.md",{"path":82,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Facceptance_criteria.md",4920,"https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fazure_security_keyvault_keys_java\u002Freferences\u002Facceptance_criteria.md",{"path":86,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fexamples.md",14987,"https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fazure_security_keyvault_keys_java\u002Freferences\u002Fexamples.md",{"path":90,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":79,"sourceHtmlUrl":91},"schema.json","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fazure_security_keyvault_keys_java\u002Fschema.json",[93,136,156,183,199,226],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":115,"publishedAt":39},"01M6JR0KQP4MHT32TN40D9CBFX","UI-UX Pro Max","Advanced UI\u002FUX analysis and generation skills with data-driven patterns. Python scripts (core.py, search.py) for systematic UI pattern extraction, design system generation, and component search from curated data sources.","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fui_components\u002Fui_ux_pro_max\u002FSKILL.md",[99,104,107,112],{"categoryNo":100,"categoryName":101,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",{"categoryNo":105,"categoryName":106,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":108,"categoryName":109,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",{"categoryNo":113,"categoryName":114,"taxonomyType":110,"taxonomyTypeDesc":111},"01JBSEEDCAT000000000000033","数据分析师",[116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135],"ux","ui","ui ux pro max","max","pro","ui ux","design","component","search","analysis","team","rd","ui-ux","active","systematic","scripts","pattern extraction","sources","advanced","data-driven",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":143,"publishedAt":39},"01M6JR0EF5AEQHP2FSTB57H05P","shadcn-ui","Expert guidance for integrating and building applications with shadcn\u002Fui components, including component discovery, installation, customization, and best practices.","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fui_components\u002Fshadcn_ui\u002FSKILL.md",[142],{"categoryNo":108,"categoryName":109,"taxonomyType":110,"taxonomyTypeDesc":111},[144,117,145,146,123,147,148,149,150,126,151,152,153,129,154,155,27,25],"shadcn","shadcn ui","components","core","best practices","applications","discovery","customization","guidance","expert","installation","ui components",{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":165,"publishedAt":39},"01M6JR08F51BEN17RHFYX65WVE","zustand_store_ts","Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state\u002Faction separation. Use when building React state management, creating global stores, or implementing reactive state patterns with Zustand.","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fzustand_store_ts\u002FSKILL.md",[162],{"categoryNo":163,"categoryName":164,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000009","前端开发",[166,167,168,169,170,171,172,173,174,175,176,177,31,178,179,180,27,181,182],"zustand store ts","zustand","store","typescript","microsoft","react","create","state management","state","react state management","management","global","patterns","separation","middleware","action","implementing",{"skillNo":184,"name":167,"nameZh":6,"description":185,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":186,"categories":187,"keywords":188,"publishedAt":39},"01M6JR00TDMVAFFCZXZ04AN7Q7","Zustand state management guide. Use when working with store code (src\u002Fstore\u002F**), implementing actions, managing state, or creating slices. Triggers on Zustand store development, state management questions, or action implementation.","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fzustand\u002FSKILL.md",[],[167,189,173,190,174,191,192,176,193,31,194,195,196,168,27,197,198,181,182],"development","code","actions","src","guide","implementation","zustand state","triggers","questions","zustand state management",{"skillNo":200,"name":201,"nameZh":6,"description":202,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":203,"categories":204,"keywords":209,"publishedAt":39},"01M6JQZSWV4KWJP112G6XHEP44","youtube_summarizer","Automatically fetch YouTube video transcripts, generate structured summaries, and send full transcripts to messaging platforms. Detects YouTube URLs and provides metadata, key insights, and downloadable transcripts.","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fyoutube_summarizer\u002FSKILL.md",[205,208],{"categoryNo":206,"categoryName":207,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":105,"categoryName":106,"taxonomyType":102,"taxonomyTypeDesc":103},[210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225],"youtube","youtube summarizer","summarizer","generate","metadata","messaging","Video","fetch","telegram","transcription","summarization","structured","full","insights","transcripts","summaries",{"skillNo":227,"name":228,"nameZh":6,"description":229,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":230,"categories":231,"keywords":232,"publishedAt":39},"01M6JQZN3QJB6B77JGKJD62DQT","youtube_clipper","YouTube 视频智能剪辑工具。下载视频和字幕，AI 分析生成精细章节（几分钟级别）， 用户选择片段后自动剪辑、翻译字幕为中英双语、烧录字幕到视频，并生成总结文案。 使用场景：当用户需要剪辑 YouTube 视频、生成短视频片段、制作双语字幕版本时。 关键词：视频剪辑、YouTube、字幕翻译、双语字幕、视频下载、clip video","https:\u002F\u002Fgithub.com\u002FLongLeo287\u002FOmniClaw\u002Fblob\u002Fmain\u002Fecosystem\u002Fskills\u002Fyoutube_clipper\u002FSKILL.md",[],[210,233,234,216,235,236,237,238,239,240,241,242,243,244,245,246,247],"clipper","youtube clipper","Bash","下载","视频","生成","关键词","翻译","read","write","clip","总结","工具","文案","sonnet"]