Secret implementation of config. Supporting config merge (#2027)
Co-authored-by: Asim Aslam <asim@aslam.me>
This commit is contained in:
		
							
								
								
									
										70
									
								
								config/secrets/encryption.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								config/secrets/encryption.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| package secrets | ||||
|  | ||||
| import ( | ||||
| 	"crypto/aes" | ||||
| 	"crypto/cipher" | ||||
| 	"crypto/rand" | ||||
| 	"encoding/hex" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| // encrypt/decrypt functions are taken from https://www.melvinvivas.com/how-to-encrypt-and-decrypt-data-using-aes/ | ||||
|  | ||||
| func encrypt(stringToEncrypt string, key []byte) (string, error) { | ||||
| 	plaintext := []byte(stringToEncrypt) | ||||
|  | ||||
| 	//Create a new Cipher Block from the key | ||||
| 	block, err := aes.NewCipher(key) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	//Create a new GCM - https://en.wikipedia.org/wiki/Galois/Counter_Mode | ||||
| 	//https://golang.org/pkg/crypto/cipher/#NewGCM | ||||
| 	aesGCM, err := cipher.NewGCM(block) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	//Create a nonce. Nonce should be from GCM | ||||
| 	nonce := make([]byte, aesGCM.NonceSize()) | ||||
| 	if _, err = io.ReadFull(rand.Reader, nonce); err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	//Encrypt the data using aesGCM.Seal | ||||
| 	//Since we don't want to save the nonce somewhere else in this case, we add it as a prefix to the encrypted data. The first nonce argument in Seal is the prefix. | ||||
| 	ciphertext := aesGCM.Seal(nonce, nonce, plaintext, nil) | ||||
| 	return fmt.Sprintf("%x", ciphertext), nil | ||||
| } | ||||
|  | ||||
| func decrypt(encryptedString string, key []byte) (string, error) { | ||||
| 	enc, _ := hex.DecodeString(encryptedString) | ||||
|  | ||||
| 	//Create a new Cipher Block from the key | ||||
| 	block, err := aes.NewCipher(key) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	//Create a new GCM | ||||
| 	aesGCM, err := cipher.NewGCM(block) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	//Get the nonce size | ||||
| 	nonceSize := aesGCM.NonceSize() | ||||
|  | ||||
| 	//Extract the nonce from the encrypted data | ||||
| 	nonce, ciphertext := enc[:nonceSize], enc[nonceSize:] | ||||
|  | ||||
| 	//Decrypt the data | ||||
| 	plaintext, err := aesGCM.Open(nil, nonce, ciphertext, nil) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	return fmt.Sprintf("%s", plaintext), nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user