我有大量使用 Jasypt 加密的数据,我需要在 Go 上对其进行解密。固定盐和随机盐。
我找到了 this repo带有 BasicTextEncryptor 的工作端口。它适用于我使用密码和随机盐加密的数据。
我尝试用我的固定字符串替换随机盐,虽然我没有收到任何错误,但它没有返回实际的加密内容。
func FDecrypt(password, cipherText, salt string, obtenationIterations int) (string, error) {
msgBytes, err := base64.StdEncoding.DecodeString(cipherText)
if err != nil {
return "", err
}
//salt := msgBytes[:8]
encText := msgBytes[8:]
dk, iv := getDerivedKey(password, salt, obtenationIterations)
block, err := des.NewCipher(dk)
if err != nil {
return "", err
}
decrypter := cipher.NewCBCDecrypter(block, iv)
decrypted := make([]byte, len(encText))
decrypter.CryptBlocks(decrypted, encText)
decryptedString := strings.TrimRight(string(decrypted), "\x01\x02\x03\x04\x05\x06\x07\x08")
return decryptedString, nil
}
func getDerivedKey(password string, salt string, count int) ([]byte, []byte) {
key := md5.Sum([]byte(password + salt))
for i := 0; i < count - 1; i++ {
key = md5.Sum(key[:])
}
return key[:8], key[8:]
}
我为测试加密了以下内容(在 Jasypt 中):
- 内容:
加密测试
- 密码:
密码
- 盐:
fixed_salt
加密结果为:IcszAY8NRJf6ANt152Fifg==
当使用上面的代码在 Go 上解密时,我得到:�p�=�
有什么建议吗?
最佳答案
很抱歉回答我自己的问题!
之前,我链接了一个 Github repository使用我用作基础的代码来解决我的问题。正如马库斯在评论中所建议的那样,我在那里开了一个问题。 repo 所有者 (Lucas Sloan) 给了我一些提示。在检查了 jasypt 源代码并弄乱了我之前发布的代码之后,我终于找到了解决方案。
这是工作代码:
func Decrypt(password, cipherText, fixedSalt string, obtenationIterations int) (string, error) {
msgBytes, err := base64.StdEncoding.DecodeString(cipherText)
if err != nil {
return "", err
}
salt := make([]byte, 8)
copy(salt[:], fixedSalt)
encText := msgBytes[:]
dk, iv := getDerivedKey(password, salt, obtenationIterations)
block, err := des.NewCipher(dk)
if err != nil {
return "", err
}
decrypter := cipher.NewCBCDecrypter(block, iv)
decrypted := make([]byte, len(encText))
decrypter.CryptBlocks(decrypted, encText)
decryptedString := strings.TrimRight(string(decrypted), "\x01\x02\x03\x04\x05\x06\x07\x08")
return decryptedString, nil
}
func getDerivedKey(password string, salt string, count int) ([]byte, []byte) {
key := md5.Sum([]byte(password + salt))
for i := 0; i < count - 1; i++ {
key = md5.Sum(key[:])
}
return key[:8], key[8:]
}
我遗漏了两个要点:
- Jasypt 将 salt 修剪为 8 字节数组:
salt := make([]byte, 8)
copy(salt[:], fixedSalt)
- 当您使用固定盐加密时,盐不会附加到结果中,因此您需要在解密时获取全部内容:
encText := msgBytes[:]
我对该存储库进行了 PR,因此您可以根据需要使用它。该包还具有加密功能(固定盐和随机盐):https://github.com/LucasSloan/passwordbasedencryption
关于go - 如何解密在 Go 中使用固定盐生成的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57085776/