Tokens de autenticação brutos do RSA - AWS Encryption SDK

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Tokens de autenticação brutos do RSA

O token de autenticação bruto do RSA realiza a criptografia e a descriptografia assimétricas das chaves de dados na memória local com chaves de encapsulamento pública e privada fornecidas. Você precisa gerar, armazenar e proteger a chave privada, de preferência em um módulo de segurança de hardware (HSM) ou em um sistema de gerenciamento de chaves. A função de criptografia criptografa a chave de dados com chave pública do RSA. A função de descriptografia descriptografa a chave de dados usando a chave privada. Você pode selecionar entre os vários modos de padding do RSA.

Um token de autenticação bruto do RSA que criptografa e descriptografa deve incluir uma chave pública e um par de chaves privadas assimétricas. No entanto, você pode criptografar dados com um token de autenticação bruto do RSA que tenha apenas uma chave pública e descriptografar dados com um token de autenticação bruto do RSA que tenha apenas uma chave privada. É possível incluir qualquer token de autenticação bruto do RSA em um multitoken de autenticação. Se você configurar um token de autenticação bruto do RSA com uma chave pública e privada, certifique-se de que eles façam parte do mesmo par de chaves. Algumas implementações de linguagem do AWS Encryption SDK não construirão um token de autenticação bruto do RSA com chaves de pares diferentes. Outras pessoas confiam em você para verificar se suas chaves são do mesmo par de chaves.

O chaveiro RSA bruto é equivalente e interopera com o JceMasterKeyin the AWS Encryption SDK for Java e o RawMasterKeyin the AWS Encryption SDK for Python quando são usados com chaves de criptografia assimétrica RSA. Você pode criptografar dados com uma implementação e descriptografá-los com qualquer outra implementação usando a mesma chave de encapsulamento. Para obter detalhes, consulte Compatibilidade dos tokens de autenticação.

nota

O token de autenticação bruto do RSA não oferece suporte a chaves assimétricas do KMS. Se você quiser usar chaves RSA KMS assimétricas, versão 4. x do AWS Encryption SDK para .NET e versão 3. x dos AWS KMS chaveiros de AWS Encryption SDK for Java suporte que usam criptografia simétrica (SYMMETRIC_DEFAULT) ou RSA assimétrica. AWS KMS keys

Se você criptografar dados com um token de autenticação bruto do RSA que inclua a chave pública de uma chave do KMS RSA nem o AWS Encryption SDK nem o AWS KMS poderão descriptografá-los. Você não pode exportar a chave privada de uma chave do AWS KMS assimétrica para um token de autenticação bruto do RSA. A operação Decrypt do AWS KMS não pode descriptografar a mensagem criptografada retornada pelo AWS Encryption SDK.

Ao criar um token de autenticação bruto do RSA no AWS Encryption SDK for C, forneça o conteúdo do arquivo PEM que inclui cada chave como uma string C com terminação nula, não um caminho nem um nome de arquivo. Ao criar um chaveiro RSA bruto JavaScript, esteja ciente da possível incompatibilidade com outras implementações de linguagem.

Namespaces e nomes

Para identificar a chave RSA em um token de autenticação, o token de autenticação bruto do RSA usa um namespace de chave e um nome de chave fornecidos por você. Esses valores não são secretos. Eles aparecem em texto simples no cabeçalho da mensagem criptografada que a operação de criptografia retorna. Recomendamos usar um namespace de chave e um nome de chave que identifique o par de chaves RSA (ou a sua chave privada) no HSM ou no sistema de gerenciamento de chaves.

nota

O namespace da chave e o nome da chave são equivalentes aos campos ID do provedor (ou provedor) e ID da chave no JceMasterKey e no RawMasterKey.

O AWS Encryption SDK for C reserva o valor do namespace da chave aws-kms para as chaves KMS. Não o use em um token de autenticação bruto do AES ou em um token de autenticação bruto do RSA com o AWS Encryption SDK for C.

Se você cria tokens de autenticação diferentes para criptografar e descriptografar determinada mensagem, o namespace e os valores do nome são cruciais. Se o namespace e o nome da chave no token de autenticação de descriptografia não corresponderem exatamente e com distinção entre maiúsculas e minúsculas ao namespace e ao nome da chave no token de autenticação de criptografia, o token de autenticação de descriptografia não será usado, mesmo que as chaves sejam do mesmo par de chaves.

O namespace da chave e o nome da chave do material da chave nos tokens de autenticação de criptografia e descriptografia devem ser os mesmos, independentemente de o token de autenticação conter a chave pública RSA, a chave privada RSA ou ambas as chaves no par de chaves. Por exemplo, imagine que você criptografe dados com um token de autenticação bruto do RSA para uma chave RSA pública com namespace HSM_01 e nome de chave RSA_2048_06. Para descriptografar esses dados, construa um token de autenticação bruto do RSA com a chave privada (ou par de chaves) e o mesmo namespace e nome de chave.

Modo de preenchimento

Você deve especificar um modo de preenchimento para tokens de autenticação RSA brutos usados para criptografia e descriptografia, ou usar atributos de sua implementação de linguagem que o especifiquem para você.

O AWS Encryption SDK é compatível os modos de preenchimento a seguir, sujeitos às restrições de cada idioma. Recomendamos um modo de preenchimento OAEP, particularmente OAEP com SHA-256 e MGF1 com preenchimento SHA-256. O modo de preenchimento PKCS1 oferece suporte somente para compatibilidade com versões anteriores.

  • OAEP com SHA-1 e MGF1 com preenchimento SHA-1

  • OAEP com SHA-256 e MGF1 com preenchimento SHA-256

  • OAEP com SHA-384 e MGF1 com preenchimento SHA-384

  • OAEP com SHA-512 e MGF1 com preenchimento SHA-512

  • Preenchimento PKCS1 v1.5

Os exemplos a seguir mostram como criar um token de autenticação bruto do RSA com a chave pública e privada de um par de chaves RSA e o OAEP com SHA-256 e MGF1 com modo de preenchimento SHA-256. As variáveis RSAPublicKey e RSAPrivateKey representam o material principal fornecido por você.

C

Para criar um token de autenticação bruto do RSA no AWS Encryption SDK for C, use aws_cryptosdk_raw_rsa_keyring_new.

Ao criar um token de autenticação bruto do RSA no AWS Encryption SDK for C, forneça o conteúdo do arquivo PEM que inclui cada chave como uma string C com terminação nula, não um caminho nem um nome de arquivo. Para obter um exemplo completo, consulte raw_rsa_keyring.c.

struct aws_allocator *alloc = aws_default_allocator(); AWS_STATIC_STRING_FROM_LITERAL(key_namespace, "HSM_01"); AWS_STATIC_STRING_FROM_LITERAL(key_name, "RSA_2048_06"); struct aws_cryptosdk_keyring *rawRsaKeyring = aws_cryptosdk_raw_rsa_keyring_new( alloc, key_namespace, key_name, private_key_from_pem, public_key_from_pem, AWS_CRYPTOSDK_RSA_OAEP_SHA256_MGF1);
C# / .NET

Para instanciar um token de autenticação bruto do RSA bruto no AWS Encryption SDK para .NET, use o método materialProviders.CreateRawRsaKeyring(). Para ver um exemplo completo, consulte rawRSA .cs KeyringExample.

O exemplo a seguir usa a versão 4.x do AWS Encryption SDK para .NET.

// Instantiate the AWS Encryption SDK and material providers var esdk = new ESDK(new AwsEncryptionSdkConfig()); var mpl = new MaterialProviders(new MaterialProvidersConfig()); var keyNamespace = "HSM_01"; var keyName = "RSA_2048_06"; // Get public and private keys from PEM files var publicKey = new MemoryStream(System.IO.File.ReadAllBytes("RSAKeyringExamplePublicKey.pem")); var privateKey = new MemoryStream(System.IO.File.ReadAllBytes("RSAKeyringExamplePrivateKey.pem")); // Create the keyring input var createRawRsaKeyringInput = new CreateRawRsaKeyringInput { KeyNamespace = keyNamespace, KeyName = keyName, PaddingScheme = PaddingScheme.OAEP_SHA512_MGF1, PublicKey = publicKey, PrivateKey = privateKey }; // Create the keyring var rawRsaKeyring = materialProviders.CreateRawRsaKeyring(createRawRsaKeyringInput);
JavaScript Browser

O AWS Encryption SDK para JavaScript no navegador obtém suas primitivas criptográficas da WebCryptobiblioteca. Antes de construir o chaveiro, você deve usar importPublicKey() e/ou importar importPrivateKey() a matéria-prima da chave para o WebCrypto backend. Isso garante que o chaveiro esteja completo, mesmo que todas as chamadas sejam WebCrypto assíncronas. O objeto usado pelos métodos de importação inclui o algoritmo de encapsulamento e seu modo de preenchimento.

Depois de importar o material da chave, use o método RawRsaKeyringWebCrypto() para instanciar o token de autenticação. Ao criar um chaveiro RSA bruto JavaScript, esteja ciente da possível incompatibilidade com outras implementações de linguagem.

Para obter um exemplo completo, consulte rsa_simple.ts (Browser). JavaScript

const privateKey = await RawRsaKeyringWebCrypto.importPrivateKey( privateRsaJwKKey ) const publicKey = await RawRsaKeyringWebCrypto.importPublicKey( publicRsaJwKKey ) const keyNamespace = 'HSM_01' const keyName = 'RSA_2048_06' const keyring = new RawRsaKeyringWebCrypto({ keyName, keyNamespace, publicKey, privateKey, })
JavaScript Node.js

Para instanciar um token de autenticação bruto do AES no AWS Encryption SDK para JavaScript para Node.js, crie uma instância da classe RawRsaKeyringNode. O parâmetro wrapKey contém a chave pública. O parâmetro unwrapKey contém a chave privada. O construtor RawRsaKeyringNode calcula um modo de preenchimento padrão, embora você possa especificar um modo de preenchimento preferencial.

Ao criar um chaveiro RSA bruto JavaScript, esteja ciente da possível incompatibilidade com outras implementações de linguagem.

Para ver um exemplo completo, consulte rsa_simple.ts (Node.js). JavaScript

const keyNamespace = 'HSM_01' const keyName = 'RSA_2048_06' const keyring = new RawRsaKeyringNode({ keyName, keyNamespace, rsaPublicKey, rsaPrivateKey})
Java
final CreateRawRsaKeyringInput keyringInput = CreateRawRsaKeyringInput.builder() .keyName("RSA_2048_06") .keyNamespace("HSM_01") .paddingScheme(PaddingScheme.OAEP_SHA256_MGF1) .publicKey(RSAPublicKey) .privateKey(RSAPrivateKey) .build(); final MaterialProviders matProv = MaterialProviders.builder() .MaterialProvidersConfig(MaterialProvidersConfig.builder().build()) .build(); IKeyring rawRsaKeyring = matProv.CreateRawRsaKeyring(keyringInput);