Crypter / décrypter les données de Golang à l'aide d'Azure KeyVault

introduction

J'avais l'habitude d'utiliser Azure KeyValut de golang pour crypter des données, mais je n'avais pas les ressources, je l'ai donc résumé brièvement.

essayons

Les choses nécessaires

Code de chiffrement / déchiffrement KeyVault

Le premier est le code pour l'authentification Azure. Les variables d'environnement suivantes sont requises pour l'authentification avec NewAuthorizerFromEnvironment ().

Variable d'environnement Explication
AZURE_TENANT_ID ID de locataire Azure
AZURE_CLIENT_ID ID client Azure
AZURE_CERTIFICATE_PATH Chemin du certificat pour l'authentification
AZURE_CERTIFICATE_PASSWORD Mot de passe de décryptage pour le certificat d'authentification

azure.go (code d'authentification azure)


package auth

import (
	"log"

	ka "github.com/Azure/azure-sdk-for-go/services/keyvault/auth"
	"github.com/Azure/go-autorest/autorest"
)

var (
	AzureAuthorizer autorest.Authorizer
)

func init() {
	var err error
	AzureAuthorizer, err = ka.NewAuthorizerFromEnvironment()
	if err != nil {
		log.Fatal(err)
	}
}

Vient ensuite la mise en œuvre du traitement de cryptage / décryptage. Tout ce que vous avez à faire est d'exécuter la méthode fournie par Azure. Les variables d'environnement suivantes sont requises.

Variable d'environnement Explication
AZURE_VAULT_BASE_URL URL de base Azure KeyVault(xxx.vault.azure.net)
AZURE_VAULT_GENERAL_KEY_NAME Nom de clé par défaut utilisé pour un nom de clé non spécifié

key.go Traitement de cryptage / décryptage


package vault

import (
	"context"
	"log"
	"os"

	kv "github.com/Azure/azure-sdk-for-go/services/keyvault/v7.0/keyvault"
	"./auth"
)

var (
	VaultBaseURL   string
	GeneralKeyName string
)

func init() {
	VaultBaseURL = os.Getenv("AZURE_VAULT_BASE_URL")
	if len(VaultBaseURL) == 0 {
		log.Fatal("Please set environment variable \"AZURE_VAULT_BASE_URL\"")
	}
	GeneralKeyName = os.Getenv("AZURE_VAULT_GENERAL_KEY_NAME")
	if len(GeneralKeyName) == 0 {
		log.Fatal("Please set environment variable \"AZURE_VAULT_GENERAL_KEY_NAME\"")
	}
}

// keyVersion = "" -> use current key version
func Encrypt(keyName string, keyVersion string, plain *string) (kv.KeyOperationResult, error) {
	params := kv.KeyOperationsParameters{
		Algorithm: kv.RSAOAEP256,
		Value:     plain,
	}

	c := kv.New()
	c.Authorizer = auth.AzureAuthorizer
	return c.Encrypt(context.Background(), VaultBaseURL, keyName, keyVersion, params)
}

// keyVersion = "" -> use current key version
func GeneralEncrypt(plain *string) (kv.KeyOperationResult, error) {
	return Encrypt(GeneralKeyName, "", plain)
}

// keyVersion = "" -> use current key version
func Decrypt(keyName string, keyVersion string, encrypted *string) (kv.KeyOperationResult, error) {
	params := kv.KeyOperationsParameters{
		Algorithm: kv.RSAOAEP256,
		Value:     encrypted,
	}

	c := kv.New()
	c.Authorizer = auth.AzureAuthorizer
	return c.Decrypt(context.Background(), VaultBaseURL, keyName, keyVersion, params)
}

// keyVersion = "" -> use current key version
func GeneralDecrypt(keyVersion string, encrypted *string) (kv.KeyOperationResult, error) {
	return Decrypt(GeneralKeyName, keyVersion, encrypted)
}

Exemple d'exécution

main.go


	plain := hex.EncodeToString([]byte("plain text"))
	enc, _ := vault.GeneralEncrypt(&plain)

	encrypted := *enc.Result
	keyName := vault.GeneralKeyName
	keyVersion := path.Base(*enc.Kid)

	dec, _ := vault.Decrypt(keyName, keyVersion, &encrypted)
	str, _ := hex.DecodeString(*dec.Result)

Recommended Posts

Crypter / décrypter les données de Golang à l'aide d'Azure KeyVault
Obtenez des données de Twitter avec Tweepy
Envoyer des données depuis Raspberry Pi à l'aide d'AWS IOT
Essayez d'utiliser les données ouvertes de COVID-19 de Yokohama / Tokyo / Osaka
Visualisez les données réseau à partir d'IPython Notebook à l'aide de Cytoscape Partie 1
Crypter et enregistrer les données sur jupyter et décrypter si nécessaire
J'ai essayé de lire les données d'un fichier en utilisant Node.js.