返回顶部
首页 > 资讯 > 精选 >使用 cipher.AEAD.Seal() 查看内存使用情况
  • 804
分享到

使用 cipher.AEAD.Seal() 查看内存使用情况

2024-02-06 11:02:50 804人浏览 独家记忆
摘要

问题内容 我正在使用 Go 的 ChaCha20-Poly1305 实现来加密数据,但是当我加密一些大文件时,内存使用量高于我的预期。据我所知,Go 的 AEAD 密码实现意味着我们必

问题内容

我正在使用 Go 的 ChaCha20-Poly1305 实现来加密数据,但是当我加密一些大文件时,内存使用量高于我的预期。据我所知,Go 的 AEAD 密码实现意味着我们必须将整个数据保存在内存中才能创建哈希,但内存使用量是明文大小的两倍。

以下尝试加密 4 GiB 数据的小程序突出显示了这一点(在现实世界的程序中,keynonce 不应为空):

package main

import (
  "os"
  "fmt"
  "runtime"
  "golang.org/x/crypto/chacha20poly1305"
)

func main() {
  showMemUsage("START")

  plaintext := make([]byte, 4 * 1024 * 1024 * 1024) // 4 GiB

  showMemUsage("STAGE 1")

  key := make([]byte, chacha20poly1305.KeySize)
  if cipher, err := chacha20poly1305.New(key); err == nil {
    showMemUsage("STAGE 2")

    nonce := make([]byte, chacha20poly1305.NonceSize)
    cipher.Seal(plaintext[:0], nonce, plaintext, nil)
  }

  showMemUsage("END")
}

func showMemUsage(tag string) {
  var m runtime.MemStats

  runtime.ReadMemStats(&m)
  fmt.Fprintf(os.Stdout, "[%s] Alloc = %v MiB, TotalAlloc = %v MiB\n", tag, m.Alloc / 1024 / 1024, m.TotalAlloc / 1024 / 1024)
}

根据crypto/cipher/GCm.go的源代码(AES-GCM和ChaCha20-Poly1305都使用)有以下注释:

// To reuse plaintext's storage for the encrypted output, use plaintext[:0]
// as dst. Otherwise, the remaining capacity of dst must not overlap plaintext.
Seal(dst, nonce, plaintext, additionalData []byte) []byte

这意味着我应该能够重新使用内存,我已经尝试这样做,但这对我的应用程序使用的内存量没有影响 - 在调用 Seal() 之后我们总是最终使用8 GiB 内存可以加密 4 GiB 数据?

[START] Alloc = 0 MiB, TotalAlloc = 0 MiB
[STAGE 1] Alloc = 4096 MiB, TotalAlloc = 4096 MiB
[STAGE 2] Alloc = 4096 MiB, TotalAlloc = 4096 MiB
[END] Alloc = 8192 MiB, TotalAlloc = 8192 MiB

如果它重复使用内存(如暗示的那样),那么除了 AEAD 密码向密文添加相对较小的哈希值之外,我不应该期望任何大幅增加?


正确答案


您忘记考虑附加到密文的身份验证标记。如果您在初始分配中为其腾出空间,则无需进一步分配:

package main

import (
        "fmt"
        "os"
        "runtime"

        "golang.org/x/crypto/chacha20poly1305"
)

func main() {
        showMemUsage("START")

        plaintext := make([]byte, 4<<30, 4<<30+chacha20poly1305.Overhead)

        showMemUsage("STAGE 1")

        key := make([]byte, chacha20poly1305.KeySize)
        if cipher, err := chacha20poly1305.New(key); err == nil {
                showMemUsage("STAGE 2")

                nonce := make([]byte, chacha20poly1305.NonceSize)
                cipher.Seal(plaintext[:0], nonce, plaintext, nil)
        }

        showMemUsage("END")
}

func showMemUsage(tag string) {
        var m runtime.MemStats

        runtime.ReadMemStats(&m)
        fmt.Fprintf(os.Stdout, "[%s] Alloc = %v MiB, TotalAlloc = %v MiB\n", tag, m.Alloc>>20, m.TotalAlloc>>20)
}

// Output:
// [START] Alloc = 0 MiB, TotalAlloc = 0 MiB
// [STAGE 1] Alloc = 4096 MiB, TotalAlloc = 4096 MiB
// [STAGE 2] Alloc = 4096 MiB, TotalAlloc = 4096 MiB
// [END] Alloc = 4096 MiB, TotalAlloc = 4096 MiB

以上就是使用 cipher.AEAD.Seal() 查看内存使用情况的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 使用 cipher.AEAD.Seal() 查看内存使用情况

本文链接: https://lsjlt.com/news/561418.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用 cipher.AEAD.Seal() 查看内存使用情况
    问题内容 我正在使用 Go 的 ChaCha20-Poly1305 实现来加密数据,但是当我加密一些大文件时,内存使用量高于我的预期。据我所知,Go 的 AEAD 密码实现意味着我们必...
    99+
    2024-02-06
  • MySQL 5.7 查看内存使用情况
    performance_schema = 1 performance_schema_instrument = "%memory%=on" 通过命令查询 select event_name,current_alloc from ...
    99+
    2020-09-15
    MySQL 5.7 查看内存使用情况
  • 如何查看内存使用情况
    查看内存使用情况的方法:1.打开任务管理器;2.菜单栏切换“性能”选项卡;3.点击内存选项;4.查看内存使用情况;具体步骤如下:首先,在计算机桌面中使用组合键“win+R”运行“taskmgr.exe”,打开任务管理器;进入到任务管理器窗口...
    99+
    2024-04-02
  • 如何查看redis内存使用情况
    如何查看redis内存使用情况Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis的基本特点之一内存数据库,因为其数据是放在内存中的所以查询、操作...
    99+
    2024-04-02
  • linux如何查看内存使用情况
    linux中查看内存使用情况的方法:1、打开终端;2、输入“free”命令查看内存使用情况即可。具体操作步骤:使用快捷键【Ctrl+Alt+T】打开终端命令行模式。输入以下命令查看内存使用情况即可。free #查看系统内存使用情况返回结果项...
    99+
    2024-04-02
  • android怎么查看内存使用情况
    要查看Android设备的内存使用情况,你可以按照以下步骤操作:1. 打开设备的“设置”应用程序。2. 搜索并点击“存储”选项。3....
    99+
    2023-09-13
    android
  • linux怎么查看java内存使用情况
    要查看Java内存使用情况,可以使用以下命令:1. 使用jstat命令:`jstat -gc `该命令将显示与Java垃圾回收相关的...
    99+
    2023-09-27
    linux java
  • java怎么查看堆内存使用情况
    要查看Java堆内存的使用情况,可以使用Java命令行工具"jmap"和"jconsole"。1. 使用jmap命令:- 打开命令行...
    99+
    2023-09-06
    java
  • linux怎么查看jvm内存使用情况
    在Linux系统中,可以通过以下命令查看JVM内存使用情况:1. 使用top命令查看整个系统的进程状态和资源使用情况:top在top...
    99+
    2023-10-20
    linux jvm
  • 如何查看电脑内存使用情况
    这篇“如何查看电脑内存使用情况”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何查看电脑内存使用情况”文章吧。查看电脑内存使...
    99+
    2023-07-02
  • 如何查看linux内存的使用情况
    本篇内容主要讲解“如何查看linux内存的使用情况”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何查看linux内存的使用情况”吧! 在 linux 中,/proc/$PID/sta...
    99+
    2023-06-09
  • 怎么查看jvm的内存使用情况
    可以通过以下几种方式查看JVM的内存使用情况: 使用命令行工具:可以通过命令行工具jstat来查看JVM的内存使用情况。使用以下命...
    99+
    2024-04-02
  • linux如何查看redis内存使用情况
    要查看Redis内存使用情况,可以使用redis-cli工具连接到Redis服务器,并使用INFO命令来获取有关Redis实例的各种...
    99+
    2024-05-11
    redis linux
  • ubuntu怎么查看内存占用和查看cpu使用情况
    这篇文章主要介绍“ubuntu怎么查看内存占用和查看cpu使用情况”,在日常操作中,相信很多人在ubuntu怎么查看内存占用和查看cpu使用情况问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ubuntu怎么查...
    99+
    2023-06-13
  • 详解Tomcat中查看JVM内存使用情况
    TOMCAT运行时,实时监控当前应用JVM的使用情况;可以利用Tomcat自带的应用manager查看详情。 首先,确认服务目录webapps下有manager应用 其次,需要创建...
    99+
    2024-04-02
  • linux怎么查看堆栈内存使用情况
    要查看Linux系统的堆栈内存使用情况,可以使用以下命令:1. 使用top命令查看系统整体性能,包括内存使用情况。在终端中输入以下命...
    99+
    2023-08-30
    linux
  • linux怎么查看内存和cpu使用情况
    在Linux系统中,可以使用以下命令来查看内存和CPU使用情况:1. 查看内存使用情况:- 使用`free`命令可以查看系统的内存使...
    99+
    2023-08-29
    linux
  • jvm内存使用情况怎么看
    要查看JVM的内存使用情况,可以通过以下方法进行:1. 使用JDK自带的工具:JDK自带了一些监控和诊断工具,比如jconsole、...
    99+
    2023-08-11
    jvm
  • 用来查看linux内存使用情况的shell脚本
    在 linux 中,/proc/$PID/status 文件提供了该进程资源(内存,堆栈,信号量,子父进程)的使用情况,虽然linux提供了不少查看内存的命令,但都是看整体的使用情况,无法对单个进程的内存...
    99+
    2022-06-04
    脚本 内存 情况
  • linux查看内存使用情况的命令怎么用
    这篇“linux查看内存使用情况的命令怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux查看内存使用情况的命令怎...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作