我正在尝试将rails activesupport解密重写为golang,但收到此错误
err aesGCMOpen 得到密码:消息验证失败
这是主动支持解密的rails代码
class Crypton SECRET_KEY_BASE = ENV["SECRET_KEY_BASE"] class << self def encrypt text raise 'Encypt failed, secret_key_base not found' unless SECRET_KEY_BASE.present? text = text.to_s unless text.is_a? String len = ActiveSupport::MessageEncryptor.key_len salt = SecureRandom.hex len key = ActiveSupport::KeyGenerator.new(SECRET_KEY_BASE).generate_key salt, len crypt = ActiveSupport::MessageEncryptor.new key encrypted_data = crypt.encrypt_and_sign text "#{salt}$$#{encrypted_data}" end def decrypt text raise 'Decrypt failed, secret_key_base not found' unless SECRET_KEY_BASE.present? salt, data = text.split "$$" len = ActiveSupport::MessageEncryptor.key_len key = ActiveSupport::KeyGenerator.new(SECRET_KEY_BASE).generate_key salt, len crypt = ActiveSupport::MessageEncryptor.new key crypt.decrypt_and_verify data end end end
这是我的golang代码,我尝试从rails解密activesupport重写
// DecryptGCM // reference on Rails 5.2-stable: // https://github.com/rails/rails/blob/5-2-stable/activesupport/lib/active_support/message_encryptor.rb#L183 func DecryptGCM(encryptedText string, secretKeyBase string) (string, error) { encryptText := strings.Split(encryptedText, "$$") saltHex := encryptText[0] encodedText := encryptText[1] splitEncodedText := strings.Split(encodedText, "--") encodedText = splitEncodedText[0] ivText := splitEncodedText[1] authTagText := splitEncodedText[2] decodeText, err := base64.StdEncoding.DecodeString(encodedText) if err != nil { return "", fmt.Errorf(`err b64 decode text got %v`, err) } ivDecodeText, err := base64.StdEncoding.DecodeString(ivText) if err != nil { return "", fmt.Errorf(`err b64 iv got %v`, err) } authTagTextDecoded, err := base64.StdEncoding.DecodeString(authTagText) if err != nil { return "", fmt.Errorf(`err b64 auth tag got %v`, err) } key := GenerateKey(secretKeyBase, saltHex) block, err := aes.NewCipher(key) if err != nil { return "", fmt.Errorf(`err aesNewCipher got %v`, err) } aesGCM, err := cipher.NewGCM(block) if err != nil { return "", fmt.Errorf(`err chipperNewGCM got %v`, err) } plaintext, err := aesGCM.Open(nil, ivDecodeText, decodeText, authTagTextDecoded) if err != nil { return "", fmt.Errorf(`err aesGCMOpen got %v`, err) } return string(plaintext), nil } func GenerateKey(secretKeyBase string, saltHex string) []byte { key := pbkdf2.Key([]byte(secretKeyBase), []byte(saltHex), 65536, 32, sha1.New) return key } func TestMain(t *testing.T) { encryptText := "7c7eb6202943398b0d0619d008d226372f1b3b341eb39500eab71c3b67b7f641$$hDJ5e+6QkoCjk4cqT+hAY9c7Jj7Hxg==--t9hrqWnzQeeJTffr--1bHoguSmIkYQrpI1cd/KRQ==" decrypted, err := DecryptGCM(encryptText, SECRET_KEY) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Decrypted:", decrypted) } }
关键是:
SECRET_KEY_BASE="3ae9b0ce19316f877554a0427044180e27267fb9798db9147feeb318865b3a52f79824201608f6e4e10dc8e3f29e5bf4b83e46c4103ff8d98b99903d054d720i"
我从这个rails命令生成了加密数据
Crypton.encrypt("hello, world")
如果您找到任何解决方案,请发表评论,
谢谢
可以从rails加密中解密加密数据
正确答案
在Go代码的aesGCM.Open()
调用中、密文和认证标签分别在第三个和第四个参数中传递。这是错误的。两个数据必须连接并在第三个参数中传递。第四个参数需要是nil
。此参数用于此处未使用的附加数据。
另外,Go代码中缺少对解密数据的反序列化。为此,必须应用适当的库,例如ruby-marshal。
总体而言,需要进行以下更改:
import ( "bytes" rbmarshal "github.com/dozen/ruby-marshal" ... ) ... func DecryptGCM(encryptedText string, secretKeyBase string) (string, error) { ... plaintext, err := aesGCM.Open(nil, ivDecodeText, append(decodeText, authTagTextDecoded...), nil) // Fix 1 if err != nil { return "", fmt.Errorf(`err aesGCMOpen got %v`, err) } var v string rbmarshal.NewDecoder(bytes.NewReader(plaintext)).Decode(&v) // Fix 2 return string(v), nil }
通过这些更改,使用 Rails 代码加密的数据可以使用 Go 代码成功解密。
以上是错误 aesGCMOpen 得到密码:消息身份验证失败:golang 解密 gcm的详细内容。更多信息请关注PHP中文网其他相关文章!

Golang和Python的主要区别在于并发模型、类型系统、性能和执行速度。1.Golang使用CSP模型,适用于高并发任务;Python依赖多线程和GIL,适合I/O密集型任务。2.Golang是静态类型,Python是动态类型。3.Golang编译型语言执行速度快,Python解释型语言开发速度快。

Golang通常比C 慢,但Golang在并发编程和开发效率上更具优势:1)Golang的垃圾回收和并发模型使其在高并发场景下表现出色;2)C 通过手动内存管理和硬件优化获得更高性能,但开发复杂度较高。

Golang在云计算和DevOps中的应用广泛,其优势在于简单性、高效性和并发编程能力。1)在云计算中,Golang通过goroutine和channel机制高效处理并发请求。2)在DevOps中,Golang的快速编译和跨平台特性使其成为自动化工具的首选。

Golang和C 在执行效率上的表现各有优势。1)Golang通过goroutine和垃圾回收提高效率,但可能引入暂停时间。2)C 通过手动内存管理和优化实现高性能,但开发者需处理内存泄漏等问题。选择时需考虑项目需求和团队技术栈。

Golang更适合高并发任务,而Python在灵活性上更有优势。1.Golang通过goroutine和channel高效处理并发。2.Python依赖threading和asyncio,受GIL影响,但提供多种并发方式。选择应基于具体需求。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

selectgolangforhighpperformanceandcorrency,ifealforBackendServicesSandNetwork程序; selectpypypythonforrapiddevelopment,dataScience和machinelearningDuetoitsverserverserverserversator versator anderticality andextility andextentensivelibraries。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver Mac版
视觉化网页开发工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

WebStorm Mac版
好用的JavaScript开发工具