使 GCM/CBC 密码在 golang 中可流式传输

2024-01-13

Go 中的 GCM 和 CBC AES 密码不能与 StreamWriter 或 StreamReader 一起使用,这迫使我将整个文件分配到内存中。显然,这对于大文件来说并不理想。

我正在考虑通过将一些固定大小的块分配到内存中并将它们提供给 GCM 或 CBC 来使它们可流式传输,但我认为这可能是一个坏主意,因为它们被设计成这样肯定是有原因的方式。

有人可以解释为什么在不将整个文件分配到内存中的情况下不能使用这些操作模式吗?


答案很简单——这就是他们设计 API 的方式。

CBC 和 GCM 是非常不同的模式。 GCM 是 AEAD 模式(带有关联数据的验证加密)。您真的需要身份验证吗?如果没有,对于大文件,CBC 是一个不错的选择。您也可以使用 CTR 或 OFB,但它们是流媒体模式,并且对 IV 的选择非常严格。

在实施任何操作之前,我建议您阅读有关这些模式的信息。您至少必须了解它们需要哪些参数、用于什么目的以及如何生成它们。

CBC

BlockMode接口非常适合加密大文件。您只需要逐块加密即可。 CBC 需要填充,但 Go 没有实现。至少,我没有看到一个。你将不得不以某种方式处理这个问题。

GCM

气相色谱仪用途AEAD接口,它只允许您加密和解密整个消息。绝对没有理由要这样实施。 GCM是一种流模式,它实际上非常适合流加密。唯一的问题是身份验证。 GCM 在末尾生成一个标签,其作用类似于 MAC。要利用该标签,您不能仅仅加密无尽的数据流。您必须将其分成多个块并分别对它们进行身份验证。或者做其他事情,但在某些时候您必须读取该标签并验证它,否则使用 GCM 就没有意义。

一些库(包括 Go)所做的就是在加密时隐式地在末尾附加该标签,并在解密时读取和验证它。就我个人而言,我认为这是一个非常糟糕的设计。标签应该作为单独的实体提供,您不能假设它始终位于末尾。这并不是 Go 实现中的唯一问题之一。 很抱歉那次咆哮。最近我遇到了一个特别糟糕的实现。

作为解决方案,我建议您将流分成块,并使用唯一的随机数单独加密它们(这非常重要)。每个块末尾都会有一个标签,您应该验证该标签。这样您就可以使用 GCM 身份验证。是的,这有点丑陋,但是 Go 不允许您访问内部方法,因此您可以创建自己的加密 API。

作为替代方案,您可以找到不同的实现。甚至可能是一个 C 库。我可以建议 mbedtls。对我来说,这是我在 API 方面遇到的最好的实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使 GCM/CBC 密码在 golang 中可流式传输 的相关文章

  • RSA 加密-解密:BadPaddingException:数据必须以零开头

    对于一个被问了很多次的问题 我很抱歉向您询问您的技能 我有一个关于 RSA 加密的问题 我已经检查过有关此问题的其他主题 但没有找到任何有用的答案 我希望你能帮助我 我想读取一个文件 加密其内容 然后解密它并将这些解密的字节放入一个新文件中
  • Google Cloud Kubernetes 上任务队列的替代方案

    我发现任务队列主要用于App Engine标准环境 我正在将现有服务从 App Engine 迁移到 Kubernetes 任务队列的一个好的替代方案是什么 推送队列是当前正在使用的队列 我在线阅读文档并浏览了此链接 何时使用 PubSub
  • 在 Go 中使用互斥锁

    我想了解互斥体是如何工作的 据我目前的理解 它是为了进行原子操作并同步对某些数据的访问 我在这里构建了一个队列数据结构的示例 https github com arnauddri algorithms blob master data st
  • 我想在后端验证来自 golang 前端的时区

    前端在注册期间发送时区以及其他用户详细信息 我需要在时区上放置一个验证器来进行 api 测试 时区数据的格式为 GMT 10 00 Hawaii GMT 08 00 Pacific Time US amp Canada 我所做的是定义数组中
  • 初始化嵌套匿名结构

    我有一个 json 作为 fields time id status customerId additionalDetail pageInfo start 0 rows 1000 我想将我的结构编组到上面的 json 并创建如下结构 typ
  • 检查值是否实现接口的说明

    我读过 Effective Go 和其他类似这样的问答 golang接口合规性编译类型检查 https stackoverflow com questions 17994519 golang interface compliance com
  • Go中如何自定义http.Client或http.Transport超时重试?

    我想实现一个自定义http Transport对于标准http Client 如果客户端超时 它将自动重试 附 由于某种原因 习俗http Transport is a 一定有 我已经查过了hashcorp go retryablehttp
  • 当涉及多个渠道时,select 如何工作?

    我发现在多个非缓冲通道上使用 select 时 例如 select case lt chana case lt chanb 即使两个通道都有数据 但在处理此选择时 case chana 和 case chanb 的跟注不平衡 package
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • GAE Go — 如何对不存在的实体键使用 GetMulti?

    我发现自己需要做一个GetMulti使用键数组进行操作 其中某些实体存在 但有些实体不存在 我当前的代码 如下 返回错误 datastore no such entity err datastore GetMulti c keys info
  • 如何在 Go 中解组具有多个项目的简单 xml?

    我想从以下 xml 中获取人物 People 的一部分
  • 如何在特定文件夹中运行 shell 命令

    我可以用这个out err exec Command git log Output 获取将在与可执行位置相同的路径中运行的命令的输出 如何指定要在哪个文件夹中运行命令 exec Command https golang org pkg os
  • 鸭子在 Go 中打字

    我想写一个Join函数接受任意对象String 方法 package main import fmt strings type myint int func i myint String string return fmt Sprintf
  • Golang GAE - 小胡子结构中的 intID

    这是一个Example https www dropbox com sh ur2ws1jnik6euef PjVJSwDTUc Blog Golang zip该应用程序的 关键代码在 golang code handler handler
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • Keystore getEntry 在 Android 9 上返回 NULL

    c我已对存储在 Android 密钥库中的登录密码进行了加密和解密 在 Android 9 上 我观察到应用程序在尝试解密密码时崩溃 我无法重现它 但拥有 Pixel 3 的用户是崩溃的设备之一 下面是我如何从密钥库解密密码 private
  • 在 Go 中初始化嵌入结构

    我有以下内容struct其中包含一个net http Request type MyRequest struct http Request PathParams map string string 现在我想初始化匿名内部结构http Req
  • 在 JavaScript 中生成 RSA 密钥对

    我最近发现了这个 RSA JavaScript 库 http www ohdave com rsa http www ohdave com rsa 但是 它要求预先生成密钥 这是我的问题 问题 我想在 JavaScript 中生成 RSA
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr

随机推荐