精华内容
下载资源
问答
  • API接口安全设计
    千次阅读
    2018-10-28 13:21:09

    接口的安全性主要围绕token、timestamp和sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看:

    Token授权机制

    用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。Token是客户端访问服务端的凭证

    时间戳超时机制

    用户每次请求都带上当前时间的时间戳timestamp,服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如5分钟),则认为该请求失效。时间戳超时机制是防御DOS攻击的有效手段

    签名机制

    将 Token 和 时间戳 加上其他请求参数再用MD5或SHA-1算法(可根据情况加点盐)加密,加密后的数据就是本次请求的签名sign,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。签名机制保证了数据不会被篡改

    拒绝重复调用(非必须):

    客户端第一次访问时,将签名sign存放到缓存服务器中,超时时间设定为跟时间戳的超时时间一致,二者时间一致可以保证无论在timestamp限定时间内还是外 URL都只能访问一次。如果有人使用同一个URL再次访问,如果发现缓存服务器中已经存在了本次签名,则拒绝服务。如果在缓存中的签名失效的情况下,有人使用同一个URL再次访问,则会被时间戳超时机制拦截。这就是为什么要求时间戳的超时时间要设定为跟时间戳的超时时间一致。拒绝重复调用机制确保URL被别人截获了也无法使用(如抓取数据)

    流程如下:

    • 客户端通过用户名密码登录服务器并获取Token

    • 客户端生成时间戳timestamp,并将timestamp作为其中一个参数。

    • 客户端将所有的参数,包括Token和timestamp按照自己的算法进行排序加密得到签名sign

    • 将token、timestamp和sign作为请求时必须携带的参数加在每个请求的URL后边(http://api.com/users?token=asdsadasd&timestamp=123&sign=123123123)

    • 服务端写一个过滤器对token、timestamp和sign进行验证,只有在token有效、timestamp未超时、缓存服务器中不存在sign三种情况同时满足,本次请求才有效

    在以上三中机制的保护下,

    如果有人劫持了请求,并对请求中的参数进行了修改,签名就无法通过;

    如果有人使用已经劫持的URL进行DOS攻击,服务器则会因为缓存服务器中已经存在签名或时间戳超时而拒绝服务,所以DOS攻击也是不可能的;

    如果签名算法和用户名密码都暴露了,那齐天大圣来了估计也不好使吧。。。。

    最后说一句,所有的安全措施都用上的话有时候难免太过复杂,在实际项目中需要根据自身情况作出裁剪,比如可以只使用签名机制就可以保证信息不会被篡改,或者定向提供服务的时候只用Token机制就可以了。如何裁剪,全看项目实际情况和对接口安全性的要求~

    原文

    更多相关内容
  • API接口安全设计方案(已实现)

    千次阅读 多人点赞 2021-07-16 16:37:14
    2、接口安全设计 在代码层面,对接口进行安全设计 一、使用token进行用户身份认证 二、使用sign防止传入参数被篡改 三、用时间戳防止暴力请求 一、使用token进行用户身份认证 用户身份认证的流程图如下: 具体说明...

    1、背景

    网络安全方案,主要从数据加密与api接口安全两个方面考虑,数据加密https已经加密了,就不再次加密了;主要从api安全方面考虑。

    2、接口安全设计

    在代码层面,对接口进行安全设计
    一、使用token进行用户身份认证
    二、使用sign防止传入参数被篡改
    三、用时间戳防止暴力请求

    一、使用token进行用户身份认证

    用户身份认证的流程图如下:

    具体说明如下:

    1、 用户登录时,客户端请求接口,传入用户名和密文的密码
    2、 后台服务对用户身份进行验证。若验证失败,则返回错误结果;若验证通过,则生成一个随机不重复的token,并将其存储在redis中,设置一个过期时间。
      其中,redis的key为token,value为验证通过后获得的用户信息
    3、 用户身份校验通过后,后台服务将生成的token返回客户端。
      客户端请求后续其他接口时,需要带上这个token。后台服务会统一拦截接口请求,进行token有效性校验,并从中获取用户信息,供后续业务逻辑使用

    二、使用sign防止传入参数被篡改

    为了防止中间人攻击(客户端发来的请求被第三方拦截篡改),引入参数的签名机制。
      具体步骤如下:

    1、客户端和服务端约定一个加密算法(或MD5摘要也可), 客户端发起请求时,将所有的非空参数按升序拼在一起,通过加密算法形成一个sign,将其放在请求头中传递给后端服务。
    2、后端服务统一拦截接口请求,用接收到的非可空参数根据约定好的规则进行加密,和传入的sign值进行比较。若一致则予以放行,不一致则拒绝请求。

    由于中间人不知道加密方法,也就不能伪造一个有效的sign。从而防止了中间人对请求参数的篡改。

    三、用时间戳防止暴力请求

    sign机制可以防止参数被篡改,但无法防dos攻击(第三方使用正确的参数,不停请求服务器,使之无法正常提供服务)。因此,还需要引入时间戳机制。
      具体的操作为:客户端在形成sign值时,除了使用所有参数和token外,再加一个发起请求时的时间戳。即

    sign值来源 = 所有非空参数升序排序+token+timestamp

    而后端则需要根据当前时间和sign值的时间戳进行比较,差值超过一段时间则不予放行。
      若要求不高,则客户端和服务端可以仅仅使用精确到秒或分钟的时间戳,据此形成sign值来校验有效性。这样可以使一秒或一分钟内的请求是有效的。
      若要求较高,则还需要约定一个解密算法,使后端服务可以从sign值中解析出发起请求的时间戳。
      总结后的流程图如下:

    3、项目拟采用的方案

    (1)获取token

    这里还是隐藏下了。

    (2)接口新增三个字段:token、timestamp、sign

    { 
      "address": "33",
      "bussinessType": "22",
      "city": "111",
      "companyName": "st232ring",
      "token": "idfajdjjlkczkvhcklgjkfsj<jjkv",
      "timestamp": "20210714164139",
      "sign":"fdakfljdkfjdks"
    }
    
    

    (3)签名sign生成规则

    规则:sha1(keyvalkeyval+token+timestamp+id)

    例如:sha1(address33bussinessType22city111companyNamest232ringtokentimestampid)

    这里新增一个id值,与token对应,传输过程中不使用,只用于加密,保证数据即使被截获,因为请求中没有id的传输,更加安全。

    (4)几个参数上面已经说过了,简单再说一句。

    token身份认证;

    timestamp方式防止dos攻击,防止重放,简单说就是一次接口调用,只能用一定时间,比如比对时间,60s内该次调用有效,60秒后失效;

    sign签名,通过参数+token+timestamp+id固定位加密,保证参数不会被修改,调用有效;


    更多信息请关注公众号:「软件老王」,关注不迷路,软件老王和他的IT朋友们,分享一些他们的技术见解和生活故事。

    展开全文
  • API安全接口安全设计

    万次阅读 2019-07-13 22:07:58
    如何保证外网开放接口安全性。 使用加签名方式,防止数据篡改 信息加密与密钥管理 搭建OAuth2.0认证授权 使用令牌方式 搭建网关实现黑名单和白名单 一令牌方式搭建搭建API开放平台 方案设计: 1第三方...

    如何保证外网开放接口的安全性。

    1. 使用加签名方式,防止数据篡改
    2. 信息加密与密钥管理
    3. 搭建OAuth2.0认证授权
    4. 使用令牌方式
    5. 搭建网关实现黑名单和白名单

    一令牌方式搭建搭建API开放平台

    方案设计:

    1第三方机构申请一个appId,通过appId去获取accessToken,每次请求获取accessToken都要把老的accessToken删掉

    2第三方机构请求数据需要加上accessToken参数,每次业务处理中心执行业务前,先去dba持久层查看accessToken是否存在(可以把accessToken放到redis中,这样有个过期时间的效果),存在就说明这个机构是合法,无需要登录就可以请求业务数据。不存在说明这个机构是非法的,不返回业务数据。

    3好处:无状态设计,每次请求保证都是在我们持久层保存的机构的请求,如果有人盗用我们accessToken,可以重新申请一个新的taken.

     

     

    二基于OAuth2.0协议方式

    原理

    第三方授权,原理和1的令牌方式一样

    1假设我是服务提供者A,我有开发接口,外部机构B请求A的接口必须申请自己的appid(B机构id)

    2当B要调用A接口查某个用户信息的时候,需要对应用户授权,告诉A,我愿同意把我的信息告诉B,A生产一个授权token给B。

    3B使用token获取某个用户的信息。

     

     联合微信登录总体处理流程

    1 :用户同意授权,获取code

    2 :通过code换取网页授权access_token

    3  :通过access_token获取用户openId

    4  :通过openId获取用户信息

    三信息加密与密钥管理

    单向散列加密
    对称加密
    非对称加密
    安全密钥管理

    1单向散列加密

    散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。
    单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:
    1、MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。
    2、SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;
    SHA-1与MD5的比较
    因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
    1、对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
    2、对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
    3、速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

    1、特征:雪崩效应、定长输出和不可逆。
    2、作用是:确保数据的完整性。
    3、加密算法:md5(标准密钥长度128位)、sha1(标准密钥长度160位)、md4、CRC-32
    4、加密工具:md5sum、sha1sum、openssl dgst。
    5、计算某个文件的hash值,例如:md5sum/shalsum FileName,openssl dgst –md5/-sha

    2对称加密

     

    秘钥:加密解密使用同一个密钥、数据的机密性双向保证、加密效率高、适合加密于大数据大文件、加密强度不高(相对于非对称加密)

    对称加密优缺点

    优点:与公钥加密相比运算速度快。

    缺点:不能作为身份验证,密钥发放困难

    DES

    是一种对称加密算法,加密和解密过程中,密钥长度都必须是8的倍数
     

    
    public class DES {
    	public DES() {
    	}
    
    	// 测试
    	public static void main(String args[]) throws Exception {
    		// 待加密内容
    		String str = "123456";
    		// 密码,长度要是8的倍数 密钥随意定
    		String password = "12345678";
    		byte[] encrypt = encrypt(str.getBytes(), password);
    		System.out.println("加密前:" +str);
    		System.out.println("加密后:" + new String(encrypt));
    		// 解密
    		byte[] decrypt = decrypt(encrypt, password);
    		System.out.println("解密后:" + new String(decrypt));
    	}
    
    	/**
    	 * 加密
    	 * 
    	 * @param datasource
    	 *            byte[]
    	 * @param password
    	 *            String
    	 * @return byte[]
    	 */
    	public static byte[] encrypt(byte[] datasource, String password) {
    		try {
    			SecureRandom random = new SecureRandom();
    			DESKeySpec desKey = new DESKeySpec(password.getBytes());
    			// 创建一个密匙工厂,然后用它把DESKeySpec转换成
    			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    			SecretKey securekey = keyFactory.generateSecret(desKey);
    			// Cipher对象实际完成加密操作
    			Cipher cipher = Cipher.getInstance("DES");
    			// 用密匙初始化Cipher对象,ENCRYPT_MODE用于将 Cipher 初始化为加密模式的常量
    			cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
    			// 现在,获取数据并加密
    			// 正式执行加密操作
    			return cipher.doFinal(datasource); // 按单部分操作加密或解密数据,或者结束一个多部分操作
    		} catch (Throwable e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * 解密
    	 * 
    	 * @param src
    	 *            byte[]
    	 * @param password
    	 *            String
    	 * @return byte[]
    	 * @throws Exception
    	 */
    	public static byte[] decrypt(byte[] src, String password) throws Exception {
    		// DES算法要求有一个可信任的随机数源
    		SecureRandom random = new SecureRandom();
    		// 创建一个DESKeySpec对象
    		DESKeySpec desKey = new DESKeySpec(password.getBytes());
    		// 创建一个密匙工厂
    		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 返回实现指定转换的
    																			// Cipher
    																			// 对象
    		// 将DESKeySpec对象转换成SecretKey对象
    		SecretKey securekey = keyFactory.generateSecret(desKey);
    		// Cipher对象实际完成解密操作
    		Cipher cipher = Cipher.getInstance("DES");
    		// 用密匙初始化Cipher对象
    		cipher.init(Cipher.DECRYPT_MODE, securekey, random);
    		// 真正开始解密操作
    		return cipher.doFinal(src);
    	}
    }
    
    输出
    
    加密前:123456
    加密后:>p.72|
    解密后:123456
    

    3非对称加密

    非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。

    公钥与私钥是一对

    1. 公钥对数据进行加密,只有用对应的私钥才能解密
    2. 私钥对数据进行加密,只有用对应的公钥才能解密

    过程:

    1. 甲方生成一对密钥,并将公钥公开,乙方使用该甲方的公钥对机密信息进行加密后再发送给甲方;
    2. 甲方用自己私钥对加密后的信息进行解密。
    3. 甲方想要回复乙方时,使用乙方的公钥对数据进行加密
    4. 乙方使用自己的私钥来进行解密。

    甲方只能用其私钥解密由其公钥加密后的任何信息。

    特点:

    算法强度复杂

    保密性比较好

    加密解密速度没有对称加密解密的速度快。

    对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多

    适用于:金融,支付领域

     

    RSA加密是一种非对称加密

    import javax.crypto.Cipher;
    import java.security.*;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.security.KeyFactory;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import org.apache.commons.codec.binary.Base64;
    
    
    /**
     * RSA加解密工具类
     *
     * 
     */
    public class RSAUtil {
    
    	public static String publicKey; // 公钥
    	public static String privateKey; // 私钥
    
    	/**
    	 * 生成公钥和私钥
    	 */
    	public static void generateKey() {
    		// 1.初始化秘钥
    		KeyPairGenerator keyPairGenerator;
    		try {
    			keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    			SecureRandom sr = new SecureRandom(); // 随机数生成器
    			keyPairGenerator.initialize(512, sr); // 设置512位长的秘钥
    			KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 开始创建
    			RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
    			RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
    			// 进行转码
    			publicKey = Base64.encodeBase64String(rsaPublicKey.getEncoded());
    			// 进行转码
    			privateKey = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
    		} catch (NoSuchAlgorithmException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 私钥匙加密或解密
    	 * 
    	 * @param content
    	 * @param privateKeyStr
    	 * @return
    	 */
    	public static String encryptByprivateKey(String content, String privateKeyStr, int opmode) {
    		// 私钥要用PKCS8进行处理
    		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyStr));
    		KeyFactory keyFactory;
    		PrivateKey privateKey;
    		Cipher cipher;
    		byte[] result;
    		String text = null;
    		try {
    			keyFactory = KeyFactory.getInstance("RSA");
    			// 还原Key对象
    			privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
    			cipher = Cipher.getInstance("RSA");
    			cipher.init(opmode, privateKey);
    			if (opmode == Cipher.ENCRYPT_MODE) { // 加密
    				result = cipher.doFinal(content.getBytes());
    				text = Base64.encodeBase64String(result);
    			} else if (opmode == Cipher.DECRYPT_MODE) { // 解密
    				result = cipher.doFinal(Base64.decodeBase64(content));
    				text = new String(result, "UTF-8");
    			}
    
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return text;
    	}
    
    	/**
    	 * 公钥匙加密或解密
    	 * 
    	 * @param content
    	 * @param privateKeyStr
    	 * @return
    	 */
    	public static String encryptByPublicKey(String content, String publicKeyStr, int opmode) {
    		// 公钥要用X509进行处理
    		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyStr));
    		KeyFactory keyFactory;
    		PublicKey publicKey;
    		Cipher cipher;
    		byte[] result;
    		String text = null;
    		try {
    			keyFactory = KeyFactory.getInstance("RSA");
    			// 还原Key对象
    			publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
    			cipher = Cipher.getInstance("RSA");
    			cipher.init(opmode, publicKey);
    			if (opmode == Cipher.ENCRYPT_MODE) { // 加密
    				result = cipher.doFinal(content.getBytes());
    				text = Base64.encodeBase64String(result);
    			} else if (opmode == Cipher.DECRYPT_MODE) { // 解密
    				result = cipher.doFinal(Base64.decodeBase64(content));
    				text = new String(result, "UTF-8");
    			}
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return text;
    	}
    
    	// 测试方法
    	public static void main(String[] args) {
    		/**
    		 * 注意: 私钥加密必须公钥解密 公钥加密必须私钥解密
    		 * 	// 正常在开发中的时候,后端开发人员生成好密钥对,服务器端保存私钥 客户端保存公钥
    		 */
    		System.out.println("-------------生成两对秘钥,分别发送方和接收方保管-------------");
    		RSAUtil.generateKey();
    		System.out.println("公钥:" + RSAUtil.publicKey);
    		System.out.println("私钥:" + RSAUtil.privateKey);
    
    		System.out.println("-------------私钥加密公钥解密-------------");
    		 String textsr = "11111111";
    		 // 私钥加密
    		 String cipherText = RSAUtil.encryptByprivateKey(textsr,
    		 RSAUtil.privateKey, Cipher.ENCRYPT_MODE);
    		 System.out.println("私钥加密后:" + cipherText);
    		 // 公钥解密
    		 String text = RSAUtil.encryptByPublicKey(cipherText,
    		 RSAUtil.publicKey, Cipher.DECRYPT_MODE);
    		 System.out.println("公钥解密后:" + text);
    
    		System.out.println("-------------公钥加密私钥解密-------------");
    		// 公钥加密
    		String textsr2 = "222222";
    
    		String cipherText2 = RSAUtil.encryptByPublicKey(textsr2, RSAUtil.publicKey, Cipher.ENCRYPT_MODE);
    		System.out.println("公钥加密后:" + cipherText2);
    		// 私钥解密
    		String text2 = RSAUtil.encryptByprivateKey(cipherText2, RSAUtil.privateKey, Cipher.DECRYPT_MODE);
    		System.out.print("私钥解密后:" + text2 );
    	}
    
    }

     

     

    四使用加签名方式,防止数据篡改

    1. 客户端:请求的数据分为2部分(业务参数,签名参数),签名参数=md5(业务参数)
    2. 服务端: 验证md5(业务参数)是否与签名参数相同

     

    展开全文
  • tp5开发接口:接口安全设计

    千次阅读 2019-03-19 16:05:43
    登陆安全接口设计 1.username = red_panda 2.password = 123456 3.时间戳 timestamp = 17988732 token = md5(api_md5(red_panda) + md5(123456) + md5(timestamp)_api); service_token = md5(api_md5(red_pan...

    设计思想:以登陆接口为例

    登陆安全接口设计

    1.username = red_panda
    2.password = 123456
    3.时间戳  timestamp = 17988732


    token = md5(api_md5(red_panda) + md5(123456) + md5(timestamp)_api);
    service_token = md5(api_md5(red_panda) + md5(123456) + md5(timestamp)_api);
    两个比较,如果不等。说明数据被篡改  

    问题:
    1.防止大量访问  采用时间戳,time
    2.防止修改数据 比对token
    3.窃取信息  比如加密密码,自身加了md5,再接后缀pwd,再md5加密   md5(md5(123456)_pwd);

        password = md5(md5(123456)_pwd)

    代码如下:

    1.共有common.php

    <?php
    
    namespace app\api\controller;
    
    use think\Request;
    use think\Controller;
    
    class Common extends Controller
    {
    	protected $request;  //用来处理参数
    
    	protected function _initialize(){
    		parent::_initialize();
    		$this -> request = Request::instance();
    		// 判断传过来的时间戳是否超时
    		$this -> check_time($this->request->only(['time']));
    		// 验证token
    		$p = $this->request->param();
    		$this -> check_token($this->request->param());
    	}
    
    	/**
    	 * [check_time 验证是否超时]
    	 * @param  [array] $arr [包含时间戳的参数数组]
    	 * @return [json]      [检测结果]
    	 */
    	public function check_time($arr){
    		if (!isset($arr['time'])||intval($arr['time'])<=1 ) {
    			$this->return_msg(400,'时间戳不正确');
    		}
    		if (time()-intval($arr['time'])>60) {
    			$this->return_msg(400,'请求超时');
    		}
    	}
    
    	/**
    	 * [check_token 验证token(防止数据被篡改)]
    	 * @param  [array] $arr [全部请求参数]
    	 * @return [json]      [token验证结果]
    	 */
    	public function check_token($arr){
    		// api 传过来的 token
    		if(!isset($arr['token'])||empty($arr['token'])) {
    			$this ->return_msg(400,'token 不能为空');
    		}
    		// api 请求端的token 
    		$app_token = $arr['token'];   //api 传过来的token
    		// 服务器端生成的 token  :先从参数中剔除token
    		unset($arr['token']);
    		$service_token = '';
    		foreach ($arr as $key => $value) {
    			$service_token .= md5($value);
    		}
    		$service_token = md5('api_' . $service_token . '_api');  //服务端生成的token
    
    		// dump($service_token);
    
    		// 对比token,返回结果
    		if ($app_token !== $service_token) {
    			$this -> return_msg(400,'token不正确');
    		}
    
    	}
    
    	/**
    	 * [return_msg api数据返回]
    	 * @param  [int] $code [结果码 200:正常 / 4**:数据问题  5**:服务器问题]
    	 * @param  string $msg  [接口要返回的]
    	 * @param  [array] $data [接口要返回的数据]
    	 * @return [string]       [最终的json数据]
    	 */
    	public function return_msg($code,$msg='',$data=[]){
    		/******** 组合数据 ********/
    		$return_data['code'] = $code; 
    		$return_data['msg'] = $msg; 
    		$return_data['data'] = $data; 
    		/******** 返回信息并终止脚本 ********/
    		echo json_encode($return_data);
    		die;
    	}
    }

    2.User.php  继承common.php

    <?php
    
    namespace app\api\controller;
    
    use think\Controller;
    
    class User extends Common
    {
    	
    	public function index()
    	{
    		echo "string.user/index..sssss<br/>";
    		// dump($id);
    	}
    	public function login()
    	{
    		echo "user/login方法。。。。";
    	}
    }

     

     

     

    展开全文
  • 接口设计如何保证数据安全1

    千次阅读 2017-09-26 11:28:26
    1 我们提供接口,对接不同的客户端,但是客户端固定有几个, ...客户端请求我们接口数据: con:原始内容 content:AES(con) signature: 私钥签名(md5(content)) { source_id: content: signature: } ...
  • 安全架构-api接口安全设计

    千次阅读 2020-12-22 16:37:28
    安全架构-api接口安全设计 安全架构系列文章是从api接口的安全性设计引入的,讨论了api的业务安全-幂等性设计,传输安全,加签名和加解密,介绍了对称加密,非对称加密的常用算法的实现。继续回到api接口安全性设计...
  • 设计一个安全的对外接口如何下手?

    千次阅读 2020-04-23 22:38:03
    主要用于接口安全. 2.学习/操作 TBD 3.问题/补充 1.WiFi是什么, 有绝对安全的WiFi吗? TBD 2.如何取得路由器的管理员密码? TBD 3.如何避免在网络中暴露的位置信息 ...
  • 接口安全设计

    千次阅读 2018-08-15 10:36:28
    接口安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口数据不会被篡改和重复调用,下面具体来看: Token授权机制:用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将...
  • 一个公司需要拓展业务时,内部的业务系统往往需要跟外部系统交互,比如现在用户希望在支付宝或微信上交电费,话费,转账…那么电力公司、运营商、银行就需要跟...对外API接口安全设计及鉴权方式 API鉴权方式 ...
  • API接口安全设计思路

    千次阅读 2015-03-19 08:53:45
    API接口安全设计思路
  • web项目API接口设计与开发总结

    千次阅读 2019-08-31 18:48:47
    虽然以前自己没有设计接口,但是调用过别人写的接口,如百度提供的接口,还有以前在项目中调用别人的接口等等。感觉调用别人的接口还挺方便的,自己来设计的时候,真不知道如何下手。然后去查看学习各种教程,开始...
  • 分布式技术(6) 后端接口设计方案

    万次阅读 2019-05-01 16:54:21
    安全机制的设计 现在,大部分App的接口都采用RESTful架构,RESTFul最重要的一个设计原则就是,客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。实现上,大...
  • 数据安全实践指南

    千次阅读 2022-04-07 11:25:30
    随着互联网、物联网、云计算等技术的快速...在此背景下,国内外数据安全相关法律法规相继出台,以完善大数据安全领域的防护和技术要求,助力大数据安全建设。相较于传统网络安全数据安全的标准化起步较晚,目前...
  • Java数据传输结构设计 - 接口数据封包#接口的数据结构* 接口应该有统一的数据格式* 接口应该具有良好的容错性* 接口应该具有安全性* 接口应该提供高可读性#接口数据返回的最外层结构{ "result": "8002", "msg": ...
  • 互联网开发--HTTP接口安全设计

    千次阅读 2017-04-17 11:32:35
    http接口安全设计的必要性作为http接口的服务端,要能控制你本身自有数据的读写权限。 如果任何客户端在任何时间都能读写你的数据,那么用户数据很容易被修改。这就好比没加用户登录就可以访问和读写所有的系统...
  • 1. 数据传输加密 目前普遍采用SSL协议中相关算法进行传输层的加密,通常是对称的摘要算法(配合证书通过https进行数据对接),或者使用VPN(IPSEC VPN、SSL VPN、MPLS VPN)进行传输甚至专用电路MSTP。 2. ...
  • 接口设计原则

    千次阅读 2019-07-25 17:27:45
    3、伯斯塔尔原则 按照伯斯塔尔法则的思想来设计实现服务调用时,发送的数据要更保守,意味着最小化的传送必要的信息,接收时更开放意味着要最大限度的容忍信息的兼容性。 多余的信息不认识可以忽略,而不应该拒绝...
  • 接口测试用例设计 - 实战篇

    千次阅读 多人点赞 2021-03-14 15:10:22
    3.2 设计接口测试用例从哪些方面考虑 四.常用的接口测试用例覆盖方法 五.接口测试的接口优先级 5.1 优先级--针对所有接口 5.2 优先级--针对单个接口 六.接口测试的设计思路分析 七.接口测试返回结果的比较...
  • 接口设计方案——接口集成要求

    千次阅读 2022-04-29 17:14:15
    云平台的接口集成规范和标准,对本项目的接口设计要求和接口集成标准进行设计,包括接口集成要求、接口集成标准、接口集成方案。本文主要介绍接口集成要求。
  • 本篇图文跟大家分享一下基于高通8155的智能座舱仪表域功能安全设计。 全系内容可在《搞一下汽车电子》后台回复 “系列”,或进入菜单栏 “分享平台” --> “系列分享” 本系列请点击:《搞一下闲谈》 所有系列...
  • 接口测试简介以及接口测试用例设计思路

    万次阅读 多人点赞 2018-09-07 11:50:27
    接口就是内部模块对模块,外部系统对其他服务提供的一种可调用或者连接的能力的标准,就好比usb接口,他是系统向外接提供的一种用于物理数据传输的一个接口,当然仅仅是一个接口是不能进行传输的,我们还的对这个...
  • 安全架构-api接口签名防止数据篡改

    千次阅读 2020-12-21 13:54:04
    本篇为安全架构中api接口通信安全相关的内容,之前介绍了业务安全,如幂等性设计,不熟悉的朋友可以看下幂等性设计的文章。 文章目录安全架构-api接口签名防止数据篡改前言一、什么是接口签名?二、接口签名作用三...
  • 对外API接口设计

    千次阅读 2020-10-27 12:13:22
    对外API接口设计 安全性 1、创建appid,appkey和appsecret ps:appid:应用的唯一标识 appkey:公钥=账号 appsecret:私钥=密码 1、设计一个认证系统,专用于创建第三方接入应用的账号信息,用于生成appid,appkey和...
  • 在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢? 下面我们就来讨论下...
  • 系统接口框架设计与实现

    千次阅读 2019-07-16 14:28:28
    2 设计 2.1 InterFace 2.2 Business Service 2.3 Object Transaction Data 3 实现 3.1 WebService.asmx 3.2IBusinessService 3.3 Common (SubmitResult) 4 使用说明 4.1 编写业务代码 4.2 接口服务配置 ...
  • SpringBoot进行接口设计

    千次阅读 2018-03-26 16:38:08
    接口可以方便前后端分离,也可以方便他人调用。所以项目进行接口设计是有必要的。这里使用SpringBoot基于REST风格快速进行接口...下面贴出有关核心代码:API端:设计接口@RequestMapping(value = "/api") @...
  • java 后端设计高并发接口总结

    万次阅读 2019-02-27 22:55:43
    如何设置高并发接口一、并发队列的选择二、请求接口的合理设计三、高并发下的数据安全3、1 超发的原因3、2 悲观锁思路3、3 FIFO队列思路3、4 乐观锁思路 一、并发队列的选择 Java的并发包提供了三个常用的并发队列...
  • 基本上系统都会涉及与外部系统的交互,不论数据、或者业务上,这就涉及到 SDK 接口开发,假设接口由您来设计并开发,那么如何保证整个流程的对接、安全性又如何保证呢?ok,开始今天的学习。 (一)SDK 介绍 SDK ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 495,849
精华内容 198,339
关键字:

安全设计—接口数据的设计

友情链接: lptoolbox.tar.gz