linux

Linux环境下Golang如何进行数据加密

小樊
38
2025-11-20 18:22:38
栏目: 编程语言

在Linux环境下,使用Golang进行数据加密可以通过多种方式实现。以下是一些常用的加密算法和库:

1. 使用标准库 crypto

Go的标准库 crypto 提供了多种加密算法,包括对称加密和非对称加密。

对称加密示例(AES)

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/hex"
	"fmt"
	"io"
)

func main() {
	key := []byte("this is a key123") // 16字节密钥
	plaintext := []byte("Hello, World!")

	block, err := aes.NewCipher(key)
	if err != nil {
		panic(err)
	}

	aesGCM, err := cipher.NewGCM(block)
	if err != nil {
		panic(err)
	}

	nonce := make([]byte, aesGCM.NonceSize())
	if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
		panic(err)
	}

	ciphertext := aesGCM.Seal(nonce, nonce, plaintext, nil)
	encryptedHex := hex.EncodeToString(ciphertext)

	fmt.Printf("Encrypted: %s\n", encryptedHex)
}

非对称加密示例(RSA)

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"fmt"
)

func main() {
	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
	if err != nil {
		panic(err)
	}

	privateKeyPEM := pem.EncodeToMemory(
		&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)},
	)

	fmt.Printf("Private Key:\n%s\n", privateKeyPEM)

	publicKey := &privateKey.PublicKey

	publicKeyPEM, err := x509.MarshalPKIXPublicKey(publicKey)
	if err != nil {
		panic(err)
	}

	publicKeyPEMBlock := pem.EncodeToMemory(
		&pem.Block{Type: "PUBLIC KEY", Bytes: publicKeyPEM},
	)

	fmt.Printf("Public Key:\n%s\n", publicKeyPEMBlock)
}

2. 使用第三方库

除了标准库,还有一些第三方库提供了更多的加密算法和更高级的功能。

使用 golang.org/x/crypto

这个包提供了一些额外的加密算法和工具。

package main

import (
	"crypto/sha256"
	"fmt"
	"golang.org/x/crypto/pbkdf2"
)

func main() {
	password := []byte("password")
	salt := []byte("salt")
	iter := 4096
	keyLen := 32

	key := pbkdf2.Key(password, salt, iter, keyLen, sha256.New)
	fmt.Printf("Key: %x\n", key)
}

3. 使用环境变量和配置文件

在实际应用中,通常会将密钥和其他敏感信息存储在环境变量或配置文件中,而不是硬编码在代码中。

package main

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/hex"
	"fmt"
	"io"
	"os"
)

func main() {
	key := []byte(os.Getenv("ENCRYPTION_KEY")) // 从环境变量读取密钥
	plaintext := []byte("Hello, World!")

	block, err := aes.NewCipher(key)
	if err != nil {
		panic(err)
	}

	aesGCM, err := cipher.NewGCM(block)
	if err != nil {
		panic(err)
	}

	nonce := make([]byte, aesGCM.NonceSize())
	if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
		panic(err)
	}

	ciphertext := aesGCM.Seal(nonce, nonce, plaintext, nil)
	encryptedHex := hex.EncodeToString(ciphertext)

	fmt.Printf("Encrypted: %s\n", encryptedHex)
}

总结

在Linux环境下使用Golang进行数据加密,可以通过标准库 crypto 包实现基本的对称和非对称加密,也可以使用第三方库 golang.org/x/crypto 提供更多功能。为了安全起见,建议将密钥和其他敏感信息存储在环境变量或配置文件中,而不是硬编码在代码中。

0
看了该问题的人还看了