PHP接口安全机制,前端安全机制有哪些

4747 1084 2022-12-05


PHP接口安全机制,前端安全机制有哪些

本文讲了PHP接口安全机制,前端安全机制有哪些

  1. Http接口安全概述:

       1.1、Http接口是互联网各系统之间对接的重要方式之一,使用http接口,开发和调用都很方便,也是被大量采用的方式,它可以让不同系统之间实现数据的交换和共享,但由于http接口开放在互联网上,那么我们就需要有一定的安全措施来保证不能是随随便便就可以调用;

       1.2、目前国内互联网公司主要采用两种做法实现接口的安全:

                一种是以支付宝等支付公司为代表的私钥公钥签名验证机制;

                一种是大量互联网企业都常采用的参数签名验证机制;

2. Http接口安全演进:

         2.1.完全开放的接口(完全开放)

         2.2.接口参数签名(基本安全)

         2.3.接口参数签名+时效性验证(更加安全)

         2.4.接口参数私钥签名公钥验签(固若金汤)

         2.5.接口参数签名+Https(金钟罩)

         2.6.口参数私钥签名公钥验签+Https(金钟罩)

         总之:安全是相对的,只有相对的安全,没有绝对的安全!

3.Http接口安全设计及应用

         3.1 接口参数私钥签名公钥验签

先来看看私钥+公钥的安全模式,这是一种更为安全的方式,它通过私钥和公钥实现接口的安全,目前互联网中主要是以支付宝

为代表的公司采用这种机制;(有很多开放平台也是采用这种机制) . 具体业务流所示:

该签名是通过4个秘钥来实现的,分别是:

客户端应用私钥 , 客户端公钥 , 服务端应用私钥 , 服务端公钥.

私钥都是用来生成签名的,公钥都是用来解密的,客户端的公钥解密客户端的私钥生成的签名,服务端的公钥解密服务端的私钥生

成的签名,相信这样解释应该会比较好理解的.

        好了,下面就来看看是如何具体操作的,我的具体操作步骤:

        首先,4把密钥都是通过OpenSSL工具生成,你需要先获得这个工具:官方网站:https://www.openssl.org/

        介绍一下这个工具吧,OpenSSL 是一个开源的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序测试或其它目的使用;OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库、应用程序以及密码算法库;

        3.1.1确保Linux已经安装openssl  :  

               使用命令检查Linux是否已经安装openssl:yum list installed | grep openssl

               如果没有安装,则执行命令进行安装:yum install openssl openssl-devel -y

 3.1.2创建秘钥生成的目的地(文件夹):

ps : 我是在根目录中的soft文件夹下创建的

 mkdir server , mkdir client 先创建这两个文件,然后Linux会默认将生成的秘钥放入其中.

3.1.3 生成秘钥

进入server文件,输入openssl  进入Openssl命令行;
使用openssl生成私钥,执行如下命令:
genrsa -out rsa_private_key.pem 2048
注意一点Java开发者需要将私钥转换成PKCS8格式,其他语言不用这一步操作,执行如下命令:
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem
使用openssl生成公钥,执行如下命令:
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
退出openssl命令行:exit
经过以上步骤,我们可以在当前目录中(server)看到三个文件:
 rsa_private_key.pem(RSA私钥)
 rsa_private_key_pkcs8.pem(pkcs8格式RSA私钥)(我们java要使用的私钥是这一个)
 rsa_public_key.pem(对应RSA公钥)
         client端的秘钥与server端的秘钥生成一样,这里就不叙述了,想体验的朋友自己按照上一步操作再做一遍即可.

公钥加密

function rsaEncrypt($content,$public_key_path){ 

         $pubKey = file\_get\_contents($public_key_path);

        $res = openssl\_get\_publickey($pubKey);

        //把需要加密的内容,按128位拆开解密        

        $result  = ”;

        for($i = 0; $i < strlen($content)/128; $i++  ) {

            $data = substr($content, $i * 128, 128);

            openssl_public_encrypt ($data, $encrypt, $res);

            $result .= $encrypt;

        }

        $result = base64\_encode($result);

        openssl_free_key($res);

        return $result;

    }

私钥解密

function rsaDecrypt($content,$private_key_path){ 

        $priKey = file\_get\_contents($private_key_path);

        $res = openssl\_get\_privatekey($priKey);

        //用base64将内容还原成二进制        

        $content = base64\_decode($content);

        //把需要解密的内容,按128位拆开解密        

        $result  = ”;

        for($i = 0; $i < strlen($content)/128; $i++  ) {

            $data = substr($content, $i * 128, 128);

            openssl_private_decrypt($data, $decrypt, $res);

            $result .= $decrypt;

        }

        openssl_free_key($res);

        return $result;

    }

数字签名

function rsaSign($content,$public_key_path){ 

        $pubKey = file\_get\_contents($private_key_path);

        $res = openssl\_get\_privatekey($pubKey);

        //把需要加密的内容,按128位拆开解密

        $result = ”;

        for ($i = 0; $i < strlen($content) / 128; $i++) {

            $data = substr($content, $i * 128, 128);

            openssl_sign($data, $encrypt, $res);

            $result .= $encrypt;

        }

        $result = base64\_encode($result);

        openssl_free_key($res);

        return $result;

}

验证数字签名

function rsaVerify($data,$public_key_path,$sign){ 

        $pubKey = file\_get\_contents($public_key_path);

        $res = openssl\_get\_publickey($pubKey);

        $result = (bool)openssl\_verify($data, base64_decode($sign), $res);

        openssl_free_key($res);

        return $result;

    }

PHP中调用

header(“Content-type:text/html;charset=’utf-8”);

define(“PRIVATE_KEY”,__DIR__.”/key/rsa_private_key.pem”);

define(“PUBLIC_KEY”,__DIR__.”/key/rsa_public_key.pem”);

$msg = “My love is coincidence.”;

$rsa = new Rsa(); //rsa加密演示

$encrypt = $rsa->rsaEncrypt($msg,PUBLIC_KEY);  // 通过公钥加密

//rsa解密演示

$decrypt = $rsa->rsaDecrypt($encrypt,PRIVATE_KEY);  // 通过私钥解密

//rsa生成数字签名演示

$sign =  $rsa->rsaSign($msg,PRIVATE_KEY);   // 通过私钥生成数字签名

//rsa验证数字签名演示

$verify = $rsa->rsaVerify($msg,PUBLIC\_KEY,$sign);  // 通过公钥验证数字签名

var_dump($verify);

近年来有8大前端安全问题尤其引起关注:

1、跨站脚本攻击(Cross-Site Scripting)

2、使用iframe的风险

3、点击劫持

4、错误的内容推断

5、不安全的第三方依赖包

6、HTTPS中间人攻击

7、本地存储数据泄露

8、CDN劫持/污染


如此多的、影响重大的前端安全问题,直接把软件安全防范推上了风口浪尖,安全人员面临着挑战也倍数级增长。

端侧安全的主流解决方案

基于端侧可能得安全问题,市场上有以下6大主流解决方案:

1、APP 代码保护。由于开源技术的进步,攻击者很容易就可以获得应用的反编译代码(基本是应用源代码)。针对此攻击,提高逆向分析的门槛,可以进行代码混淆、dex 加壳、so 加壳等方式对代码进行保护。

2、APP 运行时保护。对移动端应用的逆向分析还有动态调试。通过动态调试还可以伪造或篡改请求 / 响应包,从而攻击服务器端。此种攻击可以采用市场上的一些加固工具软件对APP 进行加固保护,防止恶意破解、反编译、二次打包等。

3、APP 第三方代码安全。移动应用开发过程中,出于功能需求等原因,开发人员不可避免会集成一些其他第三方提供的代码,如 SDK。这些第三方代码未经测试和评估就直接嵌入到应用中直接使用,容易出现不可预料的后果。一方面是第三方代码的安全性未经测试,可能存在安全漏洞被攻击者利用,从而威胁整个应用的正常使用。另一方面,第三方代码额外实现了冗余功能或者申请多余的特权,可能造成用户隐私信息泄露,或者一系列恶意行为。
对于此类威胁,安全设计方案是:

1)App中大部分是web或者小程序类轻应用,可以采用市面上的安全沙箱类技术(如:FinClip),对应用进行统一的上下架管理。其特点主要体现在三个方面:

  • 沙箱内小程序之间的隔离

  • 沙箱对运行其中的小程序代码,隔离其对宿主环境的资源访问。

  • 沙箱隔离了宿主对于沙箱中运行的小程序所产生的数据。

2)集成第三方代码时,开发人员应尽可能了解第三方代码的功能,以及尽可能保证第三方代码的安全性。

4、APP 端业务安全。为了防止 APP 用户恶意注册及薅羊毛等恶意行为,可以在 APP 中加入设备指纹,进行数据埋点等,将 APP 数据接入业务风控平台,进行业务反欺诈。

5、Web 安全。对于 Web 安全,关注常见的 OWASP TOP 10 漏洞,如注入、身份认证、敏感信息泄露、安全配置错误等。常见的防御措施有认证、授权、加密、审计、输入验证等。

6、Restful API 安全。Restful API 以 URI 方式对外提供数据服务或功能服务。外部用户多数情况下是程序或系统。提供的数据服务或功能服务多数情况下,是非公开的,即需要对 HTTP 请求来源和身份做识别与认证,再经过授权决策(访问控制)后,提供相应的数据或执行功能。
随着技术的进步和发展,相信还会有更多的技术解决方案冒出。

上文就是小编为大家整理的PHP接口安全机制,前端安全机制有哪些。

国内(北京、上海、广州、深圳、成都、重庆、杭州、西安、武汉、苏州、郑州、南京、天津、长沙、东莞、宁波、佛山、合肥、青岛)Finclip软件分析、比较及推荐。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅谈前端安全,前端安全性问题解决方案
下一篇:数字化改革中,数据如何安全共享?安全沙箱技术
相关文章

 发表评论

暂时没有评论,来抢沙发吧~