【仅供内部供应商使用,不提供对外解答和培训】
...
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
//场景:以固定密钥进行MD5参数签名为例。现有业务系统服务器SA,和决策平台FR。 //在浏览器B上,通过登录SA访问FR的报表X,对其中的参数p1和p2进行防篡改保护 //准备:SA和FR后台约定一个固定且复杂度安全的密钥SCT, 假设不存在人为泄露密钥的可能。 //SA服务端生成校验信息: func( Map parameters ) //parameters是原始报表的url的参数表信息 String query = sort(parameters); //sort方法表示,将参数表按照双方约定的某种排序方法进行排序得到一个固定的参数名与参数值的键值对字符串 String SIGN = MD5( query + SCT + timestamp + timeout ) + timestamp + timeout //其中timestamp表示生成签名的时间戳,timeout表示签名的有效期 //浏览器B实际访问的URL 为 url?query&sign=SIGN //FR服务器在处理需要校验参数的请求获取具体参数时,先校验签名信息 //获取请求中的签名对象SIGN{ md5,timestamp, timeout} SIGN sign = getSign(req); //判断是否超时 if( isTimeout( sign.timestamp, sign.timeout, crtTimestamp ) ){ //超时,返回一个参数空值/或者抛出异常 return StringUtils.EMPTY; } //比较md5值是否一致 //此时的parameters需要排除sign参数 String query = sort(parameters); if( sign.md5 != MD5(query + SCT + sign.timestamp + sign.timeout) ){ //签名不匹配,返回一个参数空值/或者抛出异常 return StringUtils.EMPTY; } //返回获取到的具体参数值 return value; |
常见的可逆加密相应的,是对参数信息本身进行加密。密文可以通过可逆手段还原出原来的明文信息。它即可保障在密钥安全的前提下,请求不被篡改;也可以保障参数值本身不被肉眼或简单算法逆向识别。这类方案的重点则是保护参数中涉及的涉敏信息,诸如密码、身份证号、手机号、邮箱等等信息不轻易泄露。常见的可逆加密主要有 3DES、AES、RSA、HMAC等算法。
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
//场景:以固定密钥进行AES参数加密为例。现有业务系统服务器SA,和决策平台FR。
//在浏览器B上,通过登录SA访问FR的报表X,对其中的参数p1和p2进行加密保护(仅加密参数值)
//准备:SA和FR后台约定一个固定且复杂度安全的密钥SCT, 假设不存在人为泄露密钥的可能。
//SA服务端生成加密信息:
func( Map parameters )
for( Entry entry : parameters ){
entry.setValue( AES_E( entry.getValue(), SCT ) );
}
String query = toQuery(parameters);
//浏览器B最终访问 url?query
//FR服务器在处理需要校验参数的请求获取具体参数时,进行参数解密
//获取请求中的参数密文
String value = req.getParameter(name);
//解密密文
return AES_D( value, SCT ); |
GlobalRequestFilterProvider和RequestParameterHandler在一定条件下都可以实现上面的两种场景。
免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。
...