Uso do SDK de criptografia para criptografar e descriptografar arquivos locais
Você pode usar certos algoritmos para criptografar seus arquivos, protegendo-os contra violação ou adulteração.
O SDK de criptografia é uma biblioteca de senhas de cliente que pode criptografar e descriptografar fluxos de dados e arquivos. Você pode facilmente criptografar e descriptografar grandes quantidades de dados simplesmente chamando APIs. Ele permite que você se concentre no desenvolvimento das principais funções de suas aplicações sem se distrair com os processos de criptografia e descriptografia de dados.
Para mais informações, visite. Para obter detalhes, consulte Detalhes.
Cenário
Se arquivos e imagens grandes forem enviados ao KMS por meio de HTTPS para criptografia, um grande número de recursos de rede será consumido e a criptografia será lenta. Esta seção descreve como criptografar rapidamente uma grande quantidade de dados.
Solução
O SDK de criptografia executa a criptografia de envelope em fluxos de arquivos, segmento por segmento.
Os dados são criptografados no SDK usando a DEK gerada pelo KMS. A criptografia segmentada de arquivos na memória garante a segurança e a correção da criptografia de arquivos, porque não requer transferência de arquivos pela rede.
O SDK carrega um arquivo na memória e o processa segmento por segmento. O próximo segmento não será lido antes que a criptografia ou descriptografia do segmento atual seja concluída.
Processo
Procedimento
- Obtenha o AK e a SK.
- ACCESS_KEY: chave de acesso da conta da Huawei. Para obter detalhes, consulte Como obter uma chave de acesso (AK/SK)?
- SECRET_ACCESS_KEY: chave de acesso de segredo da conta da Huawei. Para obter detalhes, consulte Como obter uma chave de acesso (AK/SK)?
- Haverá riscos de segurança se a AK/SK usada para autenticação for gravada diretamente no código. Criptografe a AK/SK no arquivo de configuração ou nas variáveis de ambiente para armazenamento.
- Neste exemplo, a AK/SK armazenada nas variáveis de ambiente é usada para autenticação de identidade. Configure as variáveis de ambiente HUAWEICLOUD_SDK_AK e HUAWEICLOUD_SDK_SK primeiro no ambiente local.
- Obtenha informações da região.
- Faça logon no console de gerenciamento.
- Passe o mouse sobre o nome de usuário no canto superior direito e escolha My Credentials na lista suspensa.
- Obtenha o Project ID e o Project Name.
Figura 1 Obtenção do ID e do nome do projeto
- Clique em . Escolha .
- Obtenha o ID da CMK (KEYID) a ser usado na região atual.
Figura 2 Obtenção do ID da CMK
- Obtenha o ponto de extremidade (ENDPOINT) exigido pela região atual.
Um ponto de extremidade é o request address para chamar uma API. Os pontos de extremidade variam de acordo com os serviços e as regiões. Para obter os pontos de extremidade de todos os serviços, consulte Regiões e pontos de extremidade.
Figura 3 Obtenção de um ponto de extremidade
- Criptografe e descriptografe um arquivo.
public class KmsEncryptFileExample { private static final String ACCESS_KEY = System.getenv("HUAWEICLOUD_SDK_AK"); private static final String SECRET_ACCESS_KEY = System.getenv("HUAWEICLOUD_SDK_SK"); private static final String PROJECT_ID = "<projectId>"; private static final String REGION = "<region>"; private static final String KEYID = "<keyId>"; public static final String ENDPOINT = "<endpoint>"; public static void main(String[] args) throws IOException { // Source file path String encryptFileInPutPath = args[0]; // Path of the encrypted ciphertext file String encryptFileOutPutPath = args[1]; // Path of the decrypted file String decryptFileOutPutPath = args[2]; // Encryption context Map<String, String> encryptContextMap = new HashMap<>(); encryptContextMap.put("encryption", "context"); encryptContextMap.put("simple", "test"); encryptContextMap.put("caching", "encrypt"); // Construct the encryption configuration HuaweiConfig config = HuaweiConfig.builder().buildSk(SECRET_ACCESS_KEY) .buildAk(ACCESS_KEY) .buildKmsConfig(Collections.singletonList(new KMSConfig(REGION, KEYID, PROJECT_ID, ENDPOINT))) .buildCryptoAlgorithm(CryptoAlgorithm.AES_256_GCM_NOPADDING) .build(); HuaweiCrypto huaweiCrypto = new HuaweiCrypto(config); // Set the key ring. huaweiCrypto.withKeyring(new KmsKeyringFactory().getKeyring(KeyringTypeEnum.KMS_MULTI_REGION.getType())); // Encrypt the file. encryptFile(encryptContextMap, huaweiCrypto, encryptFileInPutPath, encryptFileOutPutPath); // Decrypt the file. decryptFile(huaweiCrypto, encryptFileOutPutPath, decryptFileOutPutPath); } private static void encryptFile(Map<String, String> encryptContextMap, HuaweiCrypto huaweiCrypto, String encryptFileInPutPath, String encryptFileOutPutPath) throws IOException { // fileInputStream: input stream corresponding to the encrypted file FileInputStream fileInputStream = new FileInputStream(encryptFileInPutPath); // fileOutputStream: output stream corresponding to the source file FileOutputStream fileOutputStream = new FileOutputStream(encryptFileOutPutPath); // Encryption huaweiCrypto.encrypt(fileInputStream, fileOutputStream, encryptContextMap); fileInputStream.close(); fileOutputStream.close(); } private static void decryptFile(HuaweiCrypto huaweiCrypto, String decryptFileInPutPath, String decryptFileOutPutPath) throws IOException { // in: input stream corresponding to the source file FileInputStream fileInputStream = new FileInputStream(decryptFileInPutPath); // out: output stream corresponding to the encrypted file FileOutputStream fileOutputStream = new FileOutputStream(decryptFileOutPutPath); // Decryption huaweiCrypto.decrypt(fileInputStream, fileOutputStream); fileInputStream.close(); fileOutputStream.close(); } }