一个系统在处理另一个系统发来的请求时,如果遇到 "种类 = 可乐 & 口味 = 苦味" 这样的无意义参数组合,应该如何甄别出这是一个无效的请求? 因为可乐不可能是苦味的,正常的系统不会发出这样的请求,这种请求只可能是别人伪造出来的。
最直接的甄别手段是在本系统里实现“可乐不可能是苦味”这种业务逻辑,但是本系统是一个基础应用,不应该让特殊的业务逻辑侵入。
另一种方案是让本系统通过RPC回调业务系统,校验是否“可乐,苦味”这种组合的有效性。但这会导致两个系统之间存在互调,对性能和发布都不利。
今天有个同事想出了一个简单的办法:发送端将参数组合起来加密,接收端解密文,如果解出来的东西不是一堆乱码,就可以认为这个组合是有效的。 即使中间人截获了报文,他也只能截获“可乐,甜味”,“可乐,酸甜味”这种有效的组合;如果中间人把这种组合发出来了,我们的基础系统也照样帮忙处理,没什么大不了的。
那为什么说中间人拼不出“可乐,苦味”这种无效组合的密文呢? 因为中间人不知道具体的加密办法。
所以,通过加解密就可以保证参数组合是有效的。 当然,更简单的办法是用摘要,摘要算法如MD5是不可逆的加密算法,它的执行可以快一些;不过,MD5算法很容易被人猜到,你在MD5之前应该先往明文里掺点噪音数据,并让发送方和接收方使用相同的噪音数据。