您的位置:首页 > 编程语言 > Java开发

java接口调用安全策略

2016-09-27 13:18 281 查看
1.token

token=5位随机数+时间戳

aesEnctrypt(token)

(1)验证时间和服务器时间不能超过3分。

(2)同一个时间戳,随机数只能使用一次。

2,对称加密

把参数对称加密 aes,

3,签名验证

ras

调用方,要提供公钥,sign(通过双方定义好的算法把摘要和参数计算后的值)

我们把post过来的参数先解密,通过制定的算法算出sign

我们看我们算出sign与调用方传过来的sign是否一致,一致则可以进行业务处理,不一致返回签名失败。

sign算法

secretKey是双方定义的摘要

params是参数的hashmap集合

byte[] data=Digest.getDigest(secretKey, params);

public class Digest {

     public static byte[] getDigest(String secretKey, Map<String,String> params) throws Exception{

            Set<String> keySet = params.keySet();

            TreeSet<String> sortSet = new TreeSet<>();

            sortSet.addAll(keySet);

            String keyValueStr = "";

            Iterator<String> it = sortSet.iterator();

            while(it.hasNext()){

                String key = it.next();

                String value = params.get(key);

                keyValueStr += key + value;

            }

            keyValueStr = keyValueStr + secretKey;

            MessageDigest md = MessageDigest.getInstance("SHA-1");

            return md.digest(keyValueStr.getBytes("utf-8"));

        }

}

boolean b=RsaUtil.verify(data, sign, publicKeyString);

b=false 返回签名失败。

以下是rasutil

/**

 *

 */

package com.hlmedicals.app.util;

import java.io.UnsupportedEncodingException;

import java.security.KeyFactory;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import com.itextpdf.xmp.impl.Base64;

/**

 * @author dell

 *

 */

public class RsaUtil {

    

    

    public static void main (String [] args){

        

        try {

            byte[]  privateKeyString= IConst.privateKeyString.getBytes("utf-8");

            byte[]  publicKeyString= IConst.publicKeyString.getBytes("utf-8");

            String data1 = "testabc";

            //siyao签名

            byte[] data=data1.getBytes("utf-8");

            byte[] s = sign(data, privateKeyString);

            boolean b=verify(data,s,publicKeyString);

            System.out.println(b);

            

        } catch (Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }  

        

    }

    /**

     * 使用私钥对数据进行加密签名

     * @param data 数据

     * @param privateKeyString 私钥

     * @return 加密后的签名

     */  

    public static byte[] sign(byte[] data, byte[] privateKeyString) throws Exception {  

        KeyFactory keyf = KeyFactory.getInstance("RSA");  

        PrivateKey privateKey = keyf.generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(privateKeyString)));  

        java.security.Signature signet = java.security.Signature.getInstance("SHA1withRSA");  

        signet.initSign(privateKey);  

        signet.update(data);  

        byte[] signed = signet.sign();  

        return Base64.encode(signed);  

       

    }  

    

    /**

     * 使用公钥判断签名是否与数据匹配

     * @param data 数据

     * @param sign 签名

     * @param publicKeyString 公钥

     * @return 是否篡改了数据

     */  

    public static boolean verify(byte[] data, byte[] sign, byte[] publicKeyString) throws Exception {  

        KeyFactory keyf = KeyFactory.getInstance("RSA");  

        PublicKey publicKey = keyf.generatePublic(new X509EncodedKeySpec(Base64.decode(publicKeyString)));  

        java.security.Signature signet = java.security.Signature.getInstance("SHA1withRSA");  

        signet.initVerify(publicKey);  

        signet.update(data);  

        return signet.verify(Base64.decode(sign));  

    }

}

4.hhtp 转成htts

5.后台登录要有验证码,没有验证码 ,系统会被爆破,验证码不能被多次使用。

我的项目登录成功后把验证码存在session里。要把session验证码设定为空就可以。

6.系统上传文件时候,应该上传白名单的文件类型,防止jsp、jspx在系统中执行导致系统崩掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: