Go语言中的加解密利器:go-crypto库全解析

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。

在软件开发中,数据安全和隐私保护越来越受到重视。Go 语言以其简洁高效的特性,成为了许多开发者的首选。然而,在实际项目中使用加解密时,还是需要在标准库的基础上做一些封装。go-crypto 库应运而生,它是一个专为 Golang 设计的加密解密工具库,提供了 AES 和 RSA 等多种加密算法的支持。

本文将从安装、特性、基本与高级功能,以及实际应用场景等多个角度,全面介绍这个库。

go-crypto 库简介

go-crypto 是一个为 Golang 设计的加密解密工具库,它实现了多种常用的加密算法,包括 AES 和 RSA 等。通过这个库,开发者可以轻松地在 Go 语言项目中实现数据的加密和解密,保障数据传输和存储的安全性。

安装

要在你的 Go 项目中使用 go-crypto,首先需要通过 go get 命令安装:

go get -u github.com/pudongping/go-crypto

特性

go-crypto 库提供了以下特性:

  1. AES加解密方法:支持电码本模式(ECB)、密码分组链接模式(CBC)、计算器模式(CTR)、密码反馈模式(CFB)和输出反馈模式(OFB)。
  2. RSA加解密方法:支持 RSA 加密和解密。

接下来,我就分别以 Go 和 PHP 加解密分别来演示其用法。

AES 加解密

CBC 模式

CBC 模式是密码分组链接模式,它通过将前一个块的加密结果与当前块的明文进行 XOR 操作,增加了加密数据的安全性。以下是使用 go-crypto 库进行 AES-CBC 加密和解密的示例:

Go加密,PHP解密(AES-128-CBC)

go 加密

package main

import (
    "fmt"
    "github.com/pudongping/go-crypto"
)

func main() {
   
    plaintext := "hello world! My name is Alex Pu"
    key := "1234567890123456" // 密钥字节长度必须为16个字节

    ciphertext, err := go_crypto.AESCBCEncrypt(plaintext, key)
    if err != nil {
   
        fmt.Println("出错啦!", err)
    }
    fmt.Println(ciphertext)
}

PHP 解密

<?php
$key = '1234567890123456';
$iv = mb_substr($key, 0, 16);
$s = 'BRK08I0OYOoFwhgIBT1qjFywFkLADdeLQfVZM7CPKJ8=';

$str = base64_decode($s);
$decrypted = openssl_decrypt($str, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
if (!$decrypted) {
   
    echo '解密失败' . PHP_EOL;
} else {
   
    echo($decrypted) . PHP_EOL;
}
?>

php 加密,go 解密(AES-128-CBC)

PHP 加密


$string = 'hello world! alex';
$key = '1234567890123456';
$iv = mb_substr($key, 0, 16);

$encrypted = openssl_encrypt($string, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
$s = base64_encode($encrypted);

// output is: YAZkDJYi7e9O09TRNvUf+6sFMlI8AQvZ5GVU+xJIuOc=
echo $s . PHP_EOL;

Go 解密

import "github.com/pudongping/go-crypto"

func main() {
   
    ciphertext := "YAZkDJYi7e9O09TRNvUf+6sFMlI8AQvZ5GVU+xJIuOc="
    key := "1234567890123456"

    plaintext, err := go_crypto.AESCBCDecrypt(ciphertext, key)
    if err != nil {
   
        fmt.Println("出错啦!", err)
    }

    // output is: 解密 ==>  hello world! alex
    fmt.Println("解密 ==> ", plaintext)
}

ECB 模式

ECB 模式是电码本模式,它是最简单的加密模式,但安全性较低,通常不推荐使用。以下是使用 go-crypto 库进行 AES-ECB 加密和解密的示例:

Go加密,PHP解密(AES-128-ECB)

go 加密

package main

import (
    "fmt"
    "github.com/pudongping/go-crypto"
)

func main() {
   
    plaintext := "hello world! My name is Alex Pu"
    key := "1234567890123456" // 密钥字节长度必须为16个字节

    ciphertext, err := go_crypto.AESECBEncrypt(plaintext, key)
    if err != nil {
   
        fmt.Println("出错啦!", err)
    }
    fmt.Println(ciphertext)
}

php 解密

<?php
$key = '1234567890123456';
$s = 'sRFeHhndretZFZE9/7WdGuGw1QYl8l/IlI1XEtpVzxI=';

$str = base64_decode($s);
$decrypted = openssl_decrypt($str, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
if (!$decrypted) {
   
    echo '解密失败' . PHP_EOL;
} else {
   
    echo($decrypted) . PHP_EOL;
}
?>

RSA 加解密

go-crypto 库还提供了 RSA 加密和解密的功能。以下是使用 go-crypto 库进行 RSA 加密和解密的示例:

package main

import (
    "fmt"
    "github.com/pudongping/go-crypto"
)

func main() {
   
    privateKey := []byte(`-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----`)

    publicKey := []byte(`-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----`)

    plaintext := "hello world"
    fmt.Println("原文 ==> ", plaintext)
    ciphertext, err := go_crypto.RSAEncrypt(publicKey, []byte(plaintext))
    if err != nil {
   
        fmt.Println(err)
        return
    }

    plaintext1, err := go_crypto.RSADecrypt(privateKey, ciphertext)
    fmt.Println("解密 ==> ", string(plaintext1))
    if err != nil {
   
        fmt.Println(err)
        return
    }
}

应用场景

假设你正在开发一个需要安全通信的分布式系统,go-crypto 库可以用于加密敏感数据,如用户信息、支付信息等,确保数据在传输过程中的安全性。通过使用 AES 加密,你可以保护数据不被未授权访问,而 RSA 加密则可以用于安全地传输密钥。

结语

go-crypto 库为 Go 语言开发者提供了一个强大而灵活的加密解密工具。通过本文的详细介绍,希望你能深入理解并掌握 go-crypto 的使用方法,为你的项目增加一层安全保障。在实际开发中,合理利用加密技术,可以显著提高系统的安全性和可靠性。

相关文章
|
12天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
33 2
|
10天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
20 2
|
10天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
23 2
|
15天前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
34 1
|
14天前
|
程序员 Go
go语言中的控制结构
【11月更文挑战第3天】
90 58
|
2天前
|
安全 Go 数据处理
Go语言中的并发编程:掌握goroutine和channel的艺术####
本文深入探讨了Go语言在并发编程领域的核心概念——goroutine与channel。不同于传统的单线程执行模式,Go通过轻量级的goroutine实现了高效的并发处理,而channel作为goroutines之间通信的桥梁,确保了数据传递的安全性与高效性。文章首先简述了goroutine的基本特性及其创建方法,随后详细解析了channel的类型、操作以及它们如何协同工作以构建健壮的并发应用。此外,还介绍了select语句在多路复用中的应用,以及如何利用WaitGroup等待一组goroutine完成。最后,通过一个实际案例展示了如何在Go中设计并实现一个简单的并发程序,旨在帮助读者理解并掌
|
1天前
|
Go 索引
go语言按字符(Rune)遍历
go语言按字符(Rune)遍历
12 3
|
5天前
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
22 4
|
5天前
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
35 1
|
8天前
|
Go
go语言中的continue 语句
go语言中的continue 语句
20 3