Android移动端与服务器api接口加密示例(AES,MD5,Token)

来源:互联网 发布:淘宝v3会员是几钻 编辑:程序博客网 时间:2024/06/05 08:15

移动端接口安全流程:

获取token步骤:

    * 1.拿到从后台返回的AES加密后的token

    * 2.根据约定秘钥进行解密,并把token保存下来

AES秘钥由移动端和后台商议决定

后台验证步骤:

    * 1.取出timestamp 验证是否是过期请求,过期则不处理

    * 2.通过userId和token关系表查到token 用token替换sign

    * 3.对新生成的token进行MD5,和客户端传入的sign进行比较,一致则处理



Android代码示例:

Mainactivity

public class MainActivity extends AppCompatActivity {    private TextView tvTokenKey;    private TextView tvTokenAfter;    private TextView tvUrlAfter;    String token_test="Im token";    String serect="Im Key";//此秘钥必须和解密的时候秘钥相同    private String mTokenFromServer;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tvTokenKey = (TextView) findViewById(R.id.tv_token_key);        tvTokenAfter = (TextView) findViewById(R.id.tv_token_after);        tvUrlAfter = (TextView) findViewById(R.id.tv_url_after);    }    //加密    public void encrypt(View view) {        //模拟服务端返回的token (加密之后的)        mTokenFromServer = EncryptUtils.encrypt(token_test, serect);        tvTokenKey.setText("密文:"+mTokenFromServer);    }    //解密    public void decrypt(View view) {        if (mTokenFromServer==null){            Toast.makeText(this, "请先获取密文", Toast.LENGTH_SHORT).show();        }else{        String token = ApiSecret.getToken(this,serect, mTokenFromServer);//真实token        tvTokenAfter.setText("token:"+token);}    }    //获取url    public void getUrl(View view) {        HashMap<String, String> map = new HashMap<>();        map.put("userId","3");        map.put("userName","2");        String signUrl = ApiSecret.getSignUrl(this, "www.baidu.com", map); //模拟post上传的数据        tvUrlAfter.setText("url:"+signUrl);    }}


ApiSecret

package com.yorick.gyh.apisecret;import android.content.Context;import android.text.TextUtils;import java.util.Map;import java.util.Set;/************************************************************************************************* * 作   者: 高永好 * 完成日期:2017-07-03 15:17 * 说明:对api进行加密处理 ************************************************************************************************/public class ApiSecret {    /**     * 获取token步骤:     * 1.拿到从后台返回的AES加密后的token     * 2.根据约定秘钥进行解密,并把token保存下来     * 此方法用于:1,登录获取token  2,token过期更新token     * @param context     * @param tokenFromServer AES加密后的     */    public static String getToken(Context context,String secret, String tokenFromServer){        String token = EncryptUtils.decrypt(tokenFromServer, secret);        //将token保存下来,以便下次使用        ACache.get(context).put("token",token);        return token;    }    /**     * 后台验证步骤:     * 1.取出timestamp 验证是否是过期请求,过期则不处理     * 2.通过userId和token关系表查到token 用token替换sign     * 3.对新生成的token进行MD5,和客户端传入的sign进行比较,一致则处理     * @param url 请求的url     * @param params 传入的参数,需要包含userId,不包含token     * @return     */        public static String getSignUrl(Context context,String url, Map<String,String> params){            String token=ACache.get(context).getAsString("token");            if (TextUtils.isEmpty(token)){                try {                    throw  new Exception("请先初始化token");                } catch (Exception e) {                    e.printStackTrace();                }                return "";            }            long time = System.currentTimeMillis() /1000;            String signUrl=url+"?";            Set<String> keys = params.keySet();            //构造正确的url            for (String key:keys){                signUrl+=key+"="+params.get(key)+"&";            }            //后台对time进行判断,比如两个小时之后认为这是非法请求            signUrl+=("timestamp="+time);            //对www.baidu.com?userId=3×tamp=1231413&token=123456进行MD5编码获取到Sign            String sign = EncryptUtils.encryptMD5ToString(signUrl+"&token="+token).toLowerCase();            return signUrl+"&sign="+sign;        }}


EncryptUtils和Acache见demo    Demo :点此下载ApiSecret

原创粉丝点击