猿问

我的密码脚本加密有多安全?(Golang, AES256, pbkdf2, hmac)

首先,我想说这只是一个学习练习,我不打算在生产中使用它。

我用 Golang 写了一个小应用程序,有两个功能:encrypt(plaintext string, password string)decrypt(encrypted string, password string)

加密步骤如下:

  1. 生成随机 256 位用作盐

  2. 生成 128 位用作初始化向量

  3. 使用 PDKDF2 从密码和盐生成 32 位密钥

  4. 用密钥和明文生成一个 32 位的 HMAC,并将其附加到明文的开头

  5. 在CFB模式下用AES加密hmac+plaintext

返回的字节数组如下所示:

[256 bit salt] [128 bit iv] encrypted([256 bit hmac] [plaintext])

解密时:

  1. 提取盐并使用提供的密码来计算密钥

  2. 提取IV并解密密文的加密部分

  3. 从解密值中提取mac

  4. 用明文验证mac

我还不够疯狂,无法在任何生产项目中使用我自己的加密脚本,所以请向我指出任何为我执行此操作的库(相对安全的简单密码/消息加密)


呼唤远方
浏览 260回答 1
1回答

慕侠2389804

请注意,因为问题是关于加密消息而不是密码:如果您要加密小消息而不是散列密码,那么 Go 的secretbox包(作为其 NaCl 实现的一部分)是要走的路。如果您打算推出自己的产品——我强烈建议不要这样做,除非它留在您自己的开发环境中——那么 AES-GCM 是您的最佳选择。否则,以下大部分内容仍然适用:对称加密对密码没有用。您应该没有理由需要返回明文——您应该只关心比较哈希值(或者更准确地说,派生键)。与 scrypt 或 bcrypt 相比,PBKDF2 并不理想(2015 年的 10002 轮也可能有点低)。scrypt 是内存困难的,并且更难在 GPU 上并行化,并且在 2015 年,它的寿命足够长,使其比 bcrypt 更安全(如果您的语言的 scrypt 库不是很好,您仍然会使用 bcrypt )。MAC-then-encrypt有问题- 您应该先加密 MAC。鉴于#3,您应该在 AES-CBC + HMAC 上使用 AES-GCM(伽罗华计数器模式)。Go 有一个很棒的bcrypt包和一个易于使用的 API(为你生成盐;安全地比较)。我还编写了一个镜像该包的scrypt包,因为底层 scrypt 包要求您验证自己的参数并生成自己的盐。
随时随地看视频慕课网APP

相关分类

Go
我要回答