Rails 实现的小程序后台,在做原生 APP 与小程序用户数据打通需求时,遇到了偶发性微信加密数据解密失败的情况。是的没错,解密失败的情况是偶发的!!!。报错信息如下:
OpenSSL::Cipher::CipherError: bad decrypt
就是处在了final
那里。
文档地址,文档里还提供了 Node、Python、C++、Java 的示例代码,没准能用的上。
class WXBizDataCrypt
attr_accessor :app_id, :session_key
def initialize(app_id, session_key)
@app_id = app_id
@session_key = session_key
end
def decrypt(encrypted_data, iv)
session_key = Base64.decode64(@session_key)
encrypted_data= Base64.decode64(encrypted_data)
iv = Base64.decode64(iv)
cipher = OpenSSL::Cipher::AES128.new(:CBC)
cipher.decrypt
cipher.key = session_key
cipher.iv = iv
decrypted = JSON.parse(cipher.update(encrypted_data) + cipher.final)
raise('Invalid Buffer') if decrypted['watermark']['appid'] != @app_id
decrypted
end
end
require './wx_biz_data_crypt'
app_id = 'wx4f4bc4dec97d474b'
iv = 'r7BXXKkLb8qrSNn05n0qiA=='
session_key = 'tiihtNczf5v6AKRyjwEUhQ=='
encrypted_data =
'CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM'+
'QmRzooG2xrDcvSnxIMXFufNstNGTyaGS'+
'9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+'+
'3hVbJSRgv+4lGOETKUQz6OYStslQ142d'+
'NCuabNPGBzlooOmB231qMM85d2/fV6Ch'+
'evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6'+
'/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw'+
'u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn'+
'/Hz7saL8xz+W//FRAUid1OksQaQx4CMs'+
'8LOddcQhULW4ucetDf96JcR3g0gfRK4P'+
'C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB'+
'6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns'+
'/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd'+
'lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV'+
'oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG'+
'20f0a04COwfneQAGGwd5oa+T8yO5hzuy'+
'Db/XcxxmK01EpqOyuxINew=='
pc = WXBizDataCrypt.new(app_id, session_key)
puts pc.decrypt(encrypted_data, iv)
这里执行这个测试代码是可以通过的,不过不要被它给蒙蔽了,实际生产环境里会有偶发的报错,错误比例大概是 5/1 的样子。在搜解决方案的时候遇到一个用 Node 的同学也有类似问题地址,求问最近有没有人遇到类似的问题,或者有啥解决线索提供没。 拜谢~