加密数据解密算法
接口如果涉及敏感数据(如wx.getUserInfo
当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:
对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
对称解密的目标密文为 Base64_Decode(encryptedData)。
对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。
另外,为了应用能校验数据的有效性,我们会在敏感数据加上数据水印( watermark )
微信官方提供了多种编程语言的示例代码只有C++,Nodejs,PHP,Pyhton,缺少C#版本的
public static string WXBizDataCrypt(string encrypted, string session_key, string iv)
{
//创建解密器生成工具实例
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
aes.Mode = CipherMode.CBC;
aes.BlockSize = 128;
aes.Padding = PaddingMode.PKCS7;
//设置解密器参数
//格式化待处理字符串
byte[] byte_encryptedData = Convert.FromBase64String(encrypted);
byte[] byte_iv = Convert.FromBase64String(iv);
byte[] byte_sessionKey = Convert.FromBase64String(session_key);
aes.IV = byte_iv;
aes.Key = byte_sessionKey;
//根据设置好的数据生成解密器实例
using (ICryptoTransform transform = aes.CreateDecryptor())
{
//解密
byte[] final = transform.TransformFinalBlock(byte_encryptedData, 0, byte_encryptedData.Length);
//生成结果
string result = Encoding.UTF8.GetString(final);
return result;
}
}
}
也没有java和js版本啊,比如,我需要把用户填写的信息用js加密,服务器端解密,用户重要数据服务器端加密,js端解密(防止抓包)
一样遇到这个问题,很一直没有解决
填充无效,无法被移除 这个有解决的吗?
还有就是您得解密之后的数据是字节数组,而官方给出的答案是json数据,不一致
参照其他的代码的时候,会发现有一个方法WXBizDataCrypt oWXBizDataCrypt(Appid, Session_key);然后才是WXBizDataCrypt.DecryptData(EncryptedData, Iv),这个5楼提供的方法不一致,这样解密的正确性不一定很高
我也是 用这个方法 但是 有的账户就可以解密 有的 就抱错
在 byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
System.Security.Cryptography.CryptographicException: 填充无效,无法被移除。 有人知道这个问题么
根据网上的例子写了一个,测试的是正确的,但不保证,毕竟不是官方的。。。
这个最好还是官方给出DEMO比较好,自己写的不一定好
虽然实现算法不需要自己写,但是怎么写得正确,还是需要参考官方的例子