由开发小程序信息解密 API 思考到的

最近开发了一个小功能,用于从微信返回的数据中解密获得信息。流程上不太复杂,但因为一开始设计和后续debug过程中出现了一些问题,因此记录一下,以为后人鉴。

按照我的设计,【API】的工作流程是:

  1. 从微信那里获取 密文(以下称 encryptedData)、密钥(以下称 iv)、会话凭证(以下称 session_key
  2. 后使用后两者来解开密文,获取到需要的信息
  3. 根据获取到的信息进行后续处理

这里要解释一下【解密】的工作流程:

  • 在腾讯给的解密样例中,直接给出了 encryptedDataivsession_key 的字符串,这可直接通过测试
  • 在实际工作过程中,我们只能直接从腾讯服务器得到前两者;至于 session_key,我们无法直接得到,而通常是先得到一份 代码(以下称 code),然后用 code 去向腾讯发起请求、得到一份 session_key;再用通过 code 换取到的 session_key 结合得到的 iv 去解密得到的 encryptedData

问题就出在 code->session_key 这里:

  • 在最初的设计中,我设计的解密函数 decrypt 接受的三个参数中,第三个参数是 code,也就是说换取 session_key 这件事放到了 decrypt 里面
  • code 是一次性的——每次登录小程序服务能得到一个 code,但只要用 code 去和腾讯换取 session_key 后,该 code 就失效了——这样的话,原先设计的函数就不方便进行测试
  • 于是我试图修改 decrypt 的接口:在 decrypt 之外先用 code 换取到 session_key 后,再用得到的 session_keydecrypt 内部参与解密工作

找理来说这好像也没啥大问题:无非是进行了一次功能分离,让 decrypt 更「专注」了。这里还要继续展开上面的 【解密】工作流中:即获取到 ivsession_key 后,并不能直接用于解密,因为腾讯服务器给出的这两个字符串本身经过一次编码处理,我需要对腾讯返回的两样东西进行解码处理后,才能用于解密 encryptedData。坑就是出在这里了。

在第一次设计时,我的解密函数 decrypt 接口是:

def decrypt(encrypted_data, iv, code)

解密函数内部是用的类似下述语句:

# 在解密函数中用 code 去换取 session_key
session_key = base64.b64decode(get_session_key(code))
iv = base64.b64decode(iv)
encrypted_data = base64.b64decode(encrypted_data)
# 用 session_key, iv, encrypted_data解密……

这套语句是完全copy自腾讯官方给的解密样例 demo。设计完成后(即获取到号码,并将其成功写入了数据库),我开始写单元测试。写测试时我发现了上面所说的 decrypt 的接口不适合测试的问题,然后开始改 decrypt 的接口,改成了

def decrypt(encrypted_data, iv, session_key)

解密函数内部则改成了:

# 直接使用 session_key 去做解密工作,因此不在内部对得到的 session_key 进行处理
iv = base64.b64decode(iv)
encrypted_data = base64.b64decode(encrypted_data)
# 用 session_key, iv, encrypted_data解密……

注意到了第一行:我在修改函数的过程中,把这句 session_key = base64.b64decode(get_session_key(code)) 直接就删掉了——而正常工作过程中,应该是改成 session_key = base64.b64decode(session_key)。但我没有做此处理,于是导致直接用编码过的 session_key 去做解密工作,解密不出正常的内容,得到的东西一直提示不能用 utf-8 进行解码,而我一直都没注意到解码问题在解密函数中就出了错,而是一直在解密函数外部寻找问题,甚至在出错当天对照微信官方 demo 代码也没发现自己这个问题;直到第二天S哥看不下去了,自己也跑通了一遍官方 demo,我在他跑通的官方 demo 和自己的代码上对比了几次,才发现自己忘了 decode session_key 这一事实。

我现在把问题流程写出来,连我都觉得这东西怎么会犯错,本来就应该是用 session_key 去替代掉 get_session_key(code) 的位置。是不是我太粗心了?我觉得想到这一点还不够:「粗心」可能是指「没注意到某些细节」,而为什么我会没有注意到这个细节?是不是我的某些工作流程出了问题,我有没有可能通过改变工作流程来保证我下一次不会再出类似的错?和S、Q、W等人讨论后,我觉得以后可以尝试以下方法:

  • 先写接口与文档,明确指出自己传入函数中的东西是什么,返回的是什么。比如在文档中就指出:传入的是编码过的 session_key 之类的
  • 在写接口的时候可能就要开始从测试的角度来思考接口和内部工作流,以免后续重构时还要改动接口,造成整个函数内部工作内容改动太大
  • 在命名变量时就给出一些提示,这样在使用函数时就会得到提醒。例如函数头应该写成 def decrypt(b64_encrypted_data, b64_iv, b64_session_key) 而非 def decrypt(encrypted_data, iv, session_key),这样在内部使用接收到的参数时就会明确得到的字符串是需要解码的,即便忘记,后面排查起来也会很快

总结暂时就这些。不知道有没有其他小伙伴遇到过类似的坑,有的话你们是否还有其他思路,或者对上面提出的 3 种解决方案有什么想法?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 女儿,你早上起来给我回个消息,我有话对你说。 早晨五点起床,手机一直在震动,一看,老妈来消息了。还有十几个未接电话...
    木芥子阅读 332评论 2 0
  • 他和她的俗套故事 文/岠山剑客 本作品为岠山剑客爱情故事中的一篇,更多内容点击:岠山剑客爱情故事作品集 1. 他和...
    岠山剑客阅读 759评论 2 18
  • 已经很久没写东西了。 选择继续,是因为想让自己,通过这种方式,卸下大脑的负担。思维在很长一段时间处在停滞甚至倒退的...
    freezing025阅读 237评论 0 1
  • 1 几十年前的某一天,一代才女张爱玲和胡兰成结了婚,是年他38岁,她23岁,没有举行仪式,只写婚书为定。 婚书文曰...
    小确幸来一打阅读 5,001评论 2 7