我有一个内部应用程序的一堆密码,这些密码用 node.js 加密并(不相关地)存储在 mongodb 中。我想将此应用程序转换为 Go,但我对 node.js 加密感到困惑。我已经为此浏览了 node.js 源代码,它使用的是 OpenSSL evpBytesToKey 方法。我在网上找到了一个 Golang 实现,但我仍然无法在 Go 中解密用 node.js 加密的密码。“算法”是"aes256"
this.encrypt = function(s){
var cipher = crypto.createCipher(algo, key);
var i = 0;
var encrypted = "";
while (i < s.length){
var end = Math.min(s.length-i, 15);
var chunk = s.substring(i, end+i);
encrypted += cipher.update(chunk, "utf8", "base64");
i+= end;
}
encrypted += cipher.final("base64");
encrypted = encrypted.replace(/\//g,"_").replace(/\+/g, "-"); // base64 url encode
return encrypted;
}
和 Go 代码:
func evpBytesToKey(password string, keyLen int) (key []byte, iv []byte) {
const md5Len = 16
cnt := (keyLen-1)/md5Len + 1
m := make([]byte, cnt*md5Len)
key = make([]byte, keyLen)
iv = make([]byte, md5Len)
copy(m, md5sum([]byte(password)))
// Repeatedly call md5 until bytes generated is enough.
// Each call to md5 uses data: prev md5 sum + password.
d := make([]byte, md5Len+len(password))
start := 0
for i := 1; i < cnt; i++ {
start += md5Len
copy(d, m[start-md5Len:start])
copy(d[md5Len:], password)
copy(m[start:], md5sum(d))
}
return m[:keyLen], iv
}
和解密功能
func Decrypt(key string, b64 string) string {
text := decodeBase64(b64) // base64.StdEncoding.DecodeString helper method
block, err := aes.NewCipher(evpBytesToKey(key,32))
if err != nil {
panic(err)
}
if len(text) < aes.BlockSize {
panic("ciphertext too short")
}
iv := text[:aes.BlockSize]
text = text[aes.BlockSize:]
fmt.Println(iv)
fmt.Println(text)
cfb := cipher.NewCFBDecrypter(block, iv)
cfb.XORKeyStream(text, text)
return string(text)
}
以下是一些示例数据:
8PTcrR0Nf0sltmdtvLUrFg== (你告诉我它解密的内容:)
关键是var key = "random array of characters"; 字面意思。
这超出了我个人的加密经验和培训。这是我最后的障碍...感谢您提供的任何帮助和指导。
郎朗坤
相关分类