原理请看:RSA加密 - 数据传输过程中的加密和防篡改 直接上代码:

客户端代码:

<?php
/*1:功能描述:此demo演示了一个测试接口的【访问加参】和【返回验证】测试接口的功能是:在请求的参数中添加【time】字段并返回2:基本思路:2.1:数据使用des对称加密方式通过key进行加密2.2:des key使用非对称加密RSA进行加密2.3:为避免编码问题,对数据json_encode的同时进行base64_encode2.4:为避免接口返回的明文传输,同样采用base64_encode(json_encode($data));方式3:安全性预测:3.1:RSA的非对称性3.2:因为【私钥可以生成公钥】,交换钥匙的同时,让客户端只保存两个【公钥】。 3.3:DES的【密钥】是实时更新的。3.4:试想:3.4.1:数据在发送是被修改:如果DES【deskey】钥匙被修改。那么不管数据是否被修改,都将无法DES解密数据如果数据【data】被修改。同样的,DES将无解密数据如果,修改【deskey】,利用生成的【deskey】重新加密获得【data】,RSA将无法解析出【deskey】,进而无法获取请求参数3.4.2:数据在返回时被修改亦然。4:请求预览:$data = 'api (array)data';$key = create_a_random_des_key();$post['apiName'] = base64_encode(json_encode('data' => [des object]->encrypt($key, json_encode($data)),'deskey' => [rsa object]->publicEncrypt($key)));5:返回预览:$rtn = json_decode($str, true);$rtn = json_decode(base64_decode($rtn['return']), true);$deskey = [rsa object]->publicDerypt($rtn['deskey']);$rtn = [des object]->decrypt($deskey, $rtn['data']);
*/header('Content-Type:text/html;charset="utf-8";');require_once('./ClientRSA.class.php');require_once('./ClientDES.class.php');define('DEBUG', true);if(defined('DEBUG') && DEBUG) echo '<h2>Client:</h2>';// api data$array = array('a' => 1,'b' => 2,'c' => 3);// des key , must be 8 length$deskey = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789'), -4).substr(time(), -4);// DES object$des = new ClientDES($deskey);// DES encrypt api data$data['data'] = $des->encrypt(json_encode($array));if(defined('DEBUG') && DEBUG) var_dump($des->decrypt($data['data']));if(defined('DEBUG') && DEBUG) var_dump($des->decrypt('467B65E95C26E409D7D4248428A0EE6C8A24E528AFC9251756D03874959027F2'));if(defined('DEBUG') && DEBUG) var_dump($des->decrypt($data['data'].'aaa'));  // 修改des密文,无法解密。falseif(defined('DEBUG') && DEBUG) var_dump($des->decrypt(str_shuffle($data['data'].'aaa')));// 修改des密文,无法解密。false// RSA object$rsa = new ClientRSA();// RSA encrypt DES key$data['deskey'] = $rsa->publicEncrypt($deskey);if(defined('DEBUG') && DEBUG) echo '<pre>';if(defined('DEBUG') && DEBUG) print_r($data);if(defined('DEBUG') && DEBUG) echo '</pre>';/*$data then maybe like this : Array([data] => 467B65E95C26E409D7D4248428A0EE6C8A24E528AFC9251756D03874959027F2[deskey] => aWuYzax02btcznGfaWPn+Jk8qIEjKDe0bcxPZP+p0aObEgg6/ieIQXxEZbCcuhckpYY//pUHyd09PhURpcg1zWDpPLnlyy1ezEVpqNDRk4jLMcAJpaA0uhKimOnjz2v2gnkZ2ir4H3bKEMIAfCOUOp6TwctZqipguq0pHzuhWOw=)*/$post['apiTest'] = base64_encode(json_encode($data));/*then, $post is the last data we used while requesting api. it maybe like this : and the key 'apiTest' is the ACTION_NAME we wantedArray([apiTest] => eyJkYXRhIjoiREVBRkI5RTRENEY1QUZCOUM4NEJDNTdFOThFQ0JEOTk2MENEODBGM0FFQTJBN0ZGNzRBODIxQzhBNzgwRjcwQSIsImRlc2tleSI6Ikd4ZjdhYlpwSFA2RFd2RG5uXC96YkNJYlwvKzcrbmQ2a2ZWK2p5bU05aWt6ZnNzZ3VaNFFkSFdleXJGMmF6eDEzbVVMQ2hXVzdQalE1ZnNmbks0Zlp1a1wvREV2QUhvVkhtM2lWekxCU2RYS3RuZzM5TFZ4aDF1ellvM2hIVW95d3BGWjlPdE9wVXZibzdmQ25ud0pYS25WMlRDVVVqRG1VeVdjNTQ3QmJ5enhZND0ifQ==)*/if(defined('DEBUG') && DEBUG) echo '<pre>';if(defined('DEBUG') && DEBUG) print_r($post);if(defined('DEBUG') && DEBUG) echo '</pre>';if(defined('DEBUG') && DEBUG) echo '<hr/>';if(defined('DEBUG') && DEBUG) echo '<h2>Server:</h2>';// then, curl_post($post)$url = 'http://localhost/api-security/Server/Api.class.php';$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_HEADER, 0);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $post);$res = curl_exec($curl);curl_close($curl);if(defined('DEBUG') && DEBUG) var_dump($res);/*curl_post result maybe like : string '{"return":"eyJkYXRhIjoiN0YxQzI5ODI3RDA2RjkyMDRGQzZGNTY0QTk5OERDRDhFMUExNDBCNDQzRjAxMTZGRDBEQkY4QzM3MjNFRTg4MjhBNEM3RkYwNDNCNDdGOTNGRUQwOUVFMkEwQzA4MDcxQUZFN0U0ODVCMUFGM0JBRjhDNURBOUM5NjMzQ0EyQkRFREFERDk1MERBQjg3RjczMjI2MjFGRTdBQzNENjQ1OUE5OUNBRDg0NDMxRjY2QzQ3OEU0NTdFOTUxMUQwNjZENjJGMjk5Qjg2MTFBMEIxQUFFMzZCMkRCOTEyRkI3MkUzMEExODYzODUzMDgwODZEMjY2OTREMkM1MzhFQjIyOSIsImRlc2tleSI6ImQ3Ump2SzU2eUo1S1ZlMlBuaUxjamNOdWNRZmpcL2FWcG92RzNOZjZwN0JSZ2dtVlpUT1VBd0N0VXpvWjFpXC91dmNkOFFcL0x0SWNnT0VOa0hpMGd3SE5kR2Jyb3kycmgrO'... (length=621)*/$rtn = json_decode($res, true);if(defined('DEBUG') && DEBUG) echo '<pre>';if(defined('DEBUG') && DEBUG) print_r($rtn);if(defined('DEBUG') && DEBUG) echo '</pre>';$rtn = json_decode(base64_decode($rtn['return']), true);if(defined('DEBUG') && DEBUG) echo '<pre>';if(defined('DEBUG') && DEBUG) print_r($rtn);if(defined('DEBUG') && DEBUG) echo '</pre>';/*$rtn maybe like this : Array([data] => 7F1C29827D06F9204FC6F564A998DCD8E1A140B443F0116FD0DBF8C3723EE8828A4C7FF043B47F93FED09EE2A0C08071AFE7E485B1AF3BAF8C5DA9C9633CA2BDEDADD950DAB87F7322621FE7AC3D6459A99CAD84431F66C478E457E9511D066D62F299B8611A0B1AAE36B2DB912FB72E30A186385308086D26694D2C538EB229[deskey] => d7RjvK56yJ5KVe2PniLcjcNucQfj/aVpovG3Nf6p7BRggmVZTOUAwCtUzoZ1i/uvcd8Q/LtIcgOENkHi0gwHNdGbroy2rh+9u4lgTMKUml573sGHXdb8MN/vTfetaVS1v9GUWj4wgRVU7TG16hzDf0RmeuJN6lOkDO4YbSeKG0o=)now, decrypt it. if(successfully decrypt) data is responsed by server and it has not been modified!elsedata is modified by someone!*/$rtnDeskey = $rsa->publicDecrypt($rtn['deskey']);if(defined('DEBUG') && DEBUG) echo $rtnDeskey;$des = new ClientDes($rtnDeskey);$rtn = json_decode($des->decrypt($rtn['data']), true);if(defined('DEBUG') && DEBUG) echo '<pre>';if(defined('DEBUG') && DEBUG) print_r($rtn);if(defined('DEBUG') && DEBUG) echo '</pre>';echo '<hr/>';if(count($rtn) != 0){echo '<h2>服务器成功返回:</h2>';echo '<pre>';print_r($rtn);echo '</pre>';}else{echo '<h2>接口访问失败,或者数据被恶意修改!</h2>';}?>
<?php
class ClientRSA{// client public keyprivate $ckey = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfRTdcPIH10gT9f31rQuIInLwe
7fl2dtEJ93gTmjE9c2H+kLVENWgECiJVQ5sonQNfwToMKdO0b3Olf4pgBKeLThra
z/L3nYJYlbqjHC3jTjUnZc0luumpXGsox62+PuSGBlfb8zJO6hix4GV/vhyQVCpG
9aYqgE7zyTRZYX9byQIDAQAB
-----END PUBLIC KEY-----';// server public keyprivate $skey = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwuKDdARVjVBKVv/YHl3mFIyyR
RF+UoXVVy7IQPZ1Wy7lEOMKOtNrI1L+NczppZxqIxPg5WACoo9eWWVHPY5QotC1C
jx1RNV+UQpXCtJBvuxtRzLkfwA7zJJ9etb0pN7AaE5ZcgxmxbposdVlMT1PYauLG
Frx2RUxozpN/awdVmQIDAQAB
-----END PUBLIC KEY-----';private $cp = null;     // client public key objectprivate $sp = null;     // server public key object// init client & server side public key objectspublic function __construct(){$this->cp = openssl_pkey_get_public($this->ckey);$this->sp = openssl_pkey_get_public($this->skey);}// encrypting with client public key while requesting apipublic function publicEncrypt($data){openssl_public_encrypt($data, $encrypted, $this->cp);return base64_encode($encrypted);}// decrypting whith server public key while api responsingpublic function publicDecrypt($encrypted){openssl_public_decrypt(base64_decode($encrypted), $decrypted, $this->sp);return $decrypted;}}
?>
<?php
class ClientDES{var $key;var $iv; //偏移量public function __construct( $key, $iv=0 ) {//key长度8例如:1234abcd$this->key = $key;if( $iv == 0 ) {$this->iv = $key;} else {$this->iv = mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );}}public function encrypt($str) {//加密,返回大写十六进制字符串$size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );$str = $this->pkcs5Pad ( $str, $size );return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );}public function decrypt($str) {//解密$strBin = $this->hex2bin( strtolower( $str ) );$str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );$str = $this->pkcs5Unpad( $str );return $str;}private function hex2bin($hexData) {$binData = "";for($i = 0; $i < strlen ( $hexData ); $i += 2) {$binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );}return $binData;}private function pkcs5Pad($text, $blocksize) {$pad = $blocksize - (strlen ( $text ) % $blocksize);return $text . str_repeat ( chr ( $pad ), $pad );}private function pkcs5Unpad($text) {$pad = ord ( $text {strlen ( $text ) - 1} );if ($pad > strlen ( $text ))return false;if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)return false;return substr ( $text, 0, - 1 * $pad );}
}
?>

服务器端代码:

<?php
/*1:在此统一了接口地址。如:http://localhost/api-security/Server/Api.class.php如果你使用了【单一入口】的php框架,像ThinkPHP、CI,那么,这个统一地址可能是:http://localhost/api-security/index.php/Api/Api/api其中:第一个Api是分组.Module第二个Api是控制器。Controller第三个api是动作。Action2:当然,验证数据合法性和返回时,添加参数的过程可以封装下。3:当然,状态码,你也可以封装下。或者是十六进制的。define形式的。4:基本思路在客户端已经说明了。基本上,客户端访问时如何如何,服务器就是反其道行之。服务器返回数据,其实亦然。
*/
require_once('./ServerRSA.class.php');
require_once('./ServerDES.class.php');
header('Content-Type:text/json;charset="utf-8";');
class Api{private $rsa = null;private $des = null;private $data = null;private $debug = true;private $apiName = '';const SUCCESS = 0;                               // 操作成功!const FAILED = -1;                              // 系统错误:数据库操作错误const ERROR_DATA_FORMAT_ERROR = 1;               // 系统级错误:数据格式错误/*** 构造方法,验证rsa签名是否正确  * * @author GuoJunzhou*/public function __construct(){$keys = array_keys($_POST);$values = array_values($_POST);if(count($keys) != 1 || count($values) != 1){$this->apiReturn(self::ERROR_DATA_FORMAT_ERROR, '数据格式错误!', '', '接口参数应为:{action:data},接口名称:接口参数.');}if(!$data = base64_decode(array_pop($values))){$this->apiReturn(self::ERROR_DATA_FORMAT_ERROR, '数据格式错误!', '', '接口参数不能base64解编码。');}if(!$data = json_decode($data, true)){$this->apiReturn(self::ERROR_DATA_FORMAT_ERROR, '数据格式错误!', '', '接口参数base64解编码后不能json解码。');}if(!isset($data['deskey']) || strlen($data['deskey']) == 0){$this->apiReturn(self::ERROR_DATA_FORMAT_ERROR, '数据格式错误!', '', '接口参数base64解编码,json解码后,不包含DES key参数。');}$this->rsa = new ServerRSA();$deskey = $this->rsa->privateDecrypt($data['deskey']);if(!$deskey){$this->apiReturn(self::ERROR_DATA_FORMAT_ERROR, '数据格式错误!', '', 'DES key解析错误。');}$this->des = new ServerDES($deskey);$data = $this->des->decrypt($data['data']);$data = json_decode($data, true);if(!$data){$this->apiReturn(self::ERROR_DATA_FORMAT_ERROR, '数据格式错误!', '', '无法DES解析数据。');}$this->apiName = array_pop($keys);$this->data = $data;}/*** 接口统一地址,验证是否指定【动作】并路由到指定函数处理业务逻辑   * * @author GuoJunzhou*/public function api(){$data = $this->data;if(!$this->apiName){$this->apiReturn(self::ERROR_ACTION_NOT_PROVIDED, '没有提供接口名称! ', '', '调用接口: '.$this->apiName.' 不存在.');}if(strval($this->apiName) == 'api' || !method_exists($this, strval($this->apiName))){$this->apiReturn(self::ERROR_ACTION_NOT_EXISTS, '不存在的接口名称! ', '', '没有你要请求的接口: '.$this->apiName);}$action = strval($this->apiName);$this->$action();}/*** 测试接口   * * @author GuoJunzhou*/private function apiTest(){$data = $this->data;$data['time'] = time();$this->apiReturn(self::SUCCESS, '测试接口成功返回!', $data);}private function apiReturn($status, $msg, $data, $more=false){$array = array('status' => $status,'msg' => $msg.($this->debug && $more ? $more : ''),'data' => $data);// des key , must be 8 length$deskey = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789'), -4).substr(time(), -4);// DES object$des = new ServerDES($deskey);// DES encrypt api data$rtn['data'] = $des->encrypt(json_encode($array));// RSA encrypt DES key$rtn['deskey'] = $this->rsa->privateEncrypt($deskey);echo json_encode(array('return'=>base64_encode(json_encode($rtn))));exit();}
}$api = new Api();
$api->api();
?>
<?php
class ServerRSA{// client private keyprivate $ckey = '-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ9FN1w8gfXSBP1/
fWtC4gicvB7t+XZ20Qn3eBOaMT1zYf6QtUQ1aAQKIlVDmyidA1/BOgwp07Rvc6V/
imAEp4tOGtrP8vedgliVuqMcLeNONSdlzSW66alcayjHrb4+5IYGV9vzMk7qGLHg
ZX++HJBUKkb1piqATvPJNFlhf1vJAgMBAAECgYA736xhG0oL3EkN9yhx8zG/5RP/
WJzoQOByq7pTPCr4m/Ch30qVerJAmoKvpPumN+h1zdEBk5PHiAJkm96sG/PTndEf
kZrAJ2hwSBqptcABYk6ED70gRTQ1S53tyQXIOSjRBcugY/21qeswS3nMyq3xDEPK
XpdyKPeaTyuK86AEkQJBAM1M7p1lfzEKjNw17SDMLnca/8pBcA0EEcyvtaQpRvaL
n61eQQnnPdpvHamkRBcOvgCAkfwa1uboru0QdXii/gUCQQDGmkP+KJPX9JVCrbRt
7wKyIemyNM+J6y1ZBZ2bVCf9jacCQaSkIWnIR1S9UM+1CFE30So2CA0CfCDmQy+y
7A31AkB8cGFB7j+GTkrLP7SX6KtRboAU7E0q1oijdO24r3xf/Imw4Cy0AAIx4KAu
L29GOp1YWJYkJXCVTfyZnRxXHxSxAkEAvO0zkSv4uI8rDmtAIPQllF8+eRBT/deD
JBR7ga/k+wctwK/Bd4Fxp9xzeETP0l8/I+IOTagK+Dos8d8oGQUFoQJBAI4Nwpfo
MFaLJXGY9ok45wXrcqkJgM+SN6i8hQeujXESVHYatAIL/1DgLi+u46EFD69fw0w+
c7o0HLlMsYPAzJw=
-----END PRIVATE KEY-----';// server private keyprivate $skey = '-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALC4oN0BFWNUEpW/
9geXeYUjLJFEX5ShdVXLshA9nVbLuUQ4wo602sjUv41zOmlnGojE+DlYAKij15ZZ
Uc9jlCi0LUKPHVE1X5RClcK0kG+7G1HMuR/ADvMkn161vSk3sBoTllyDGbFumix1
WUxPU9hq4sYWvHZFTGjOk39rB1WZAgMBAAECgYAfpA75QvZnYGgrc8FDPrW9Rrz2
DX3niLkPcXciPUXsgnFba6Y6EtuRVbYuR1FQCevQTSP8cGs9xogVHUzuiu+9xclX
0j4U5tPqEtujNInHaJMWHweWuNViB4QjtpMexfL2YnJJEQwPBmghIlMSvEu8VYej
BJ1o4Gs6NCPdlpt1eQJBANbassGDkTBI+zB7gKIfxP8X9OFz+2hVM98Ix6OClIP3
gCA8iZTki1tXTHM9ks20VEi6fFXm4UEsQRr0tcYlIycCQQDSkHFxZ4CkxT6k+wPN
eiL7UKrCZDb3EwDVfTZGkkFs3Y1PRdmqKGfzxqjNLQYvUb8vpBDDDOCX/6Jey2Mu
cDk/AkEAlXG/Xqz2A0DwP3PYMGyqqMjwExWKbLK/Bsbjng8I4JX57/JLvF4PtLQP
QCU3BJAHBCN6soGKcrumeWp3OWDBhwJAceqzdScJ8hrESX2EESaCxnRd7c1J72HY
kaesNYHq43r5eGnR2L0DgF9584boUbFoPd4FM4FEAPfMYHyoq/cLAQJBAJqY0dT/
lWl/A+PAemlAQxBWBuD7axY9X1+hq6vgwbyErNUXiwQJ9B9n7iJe4KsFSo8jbhSJ
DiMuwkRSktz2JzE=
-----END PRIVATE KEY-----';private $sp = null;        // server private key object private $cp = null;       // client private key object// init client & server side private objectspublic function __construct(){$this->sp = openssl_pkey_get_private($this->skey);$this->cp = openssl_pkey_get_private($this->ckey);}// encrypting with server private key while api responsingpublic function privateEncrypt($data){openssl_private_encrypt($data, $encrypted, $this->sp);return base64_encode($encrypted);}// decrypting whith client private key while api requestingpublic function privateDecrypt($encrypted){openssl_private_decrypt(base64_decode($encrypted), $decrypted, $this->cp);return $decrypted;}
}
?>

其实,ServerDES.class.php 其实和 ClientDES.class.php 的内容是一致的。只不过,在实际使用时,客户端往往是,Android、IOS,需要前端工程师使用他们的语言实现一下客户端逻辑。

ClientRSA.class.php 和 ServerRSA.class.php 的区别只是:客户端拿了两把钥匙里的两个公钥,服务器拿了两把钥匙里的两个私钥。相对的,使用了其钥匙所对应的加密解密函数。当然,客户端的逻辑,也需要前端工程师使用自己的语言来实现。

这种方式,对于安全性的考虑,欢迎大家各抒己见,我会积极参与大家的讨论。当然,你也可以邮件我。

php20141104@163.com

web_scott@163.com

RSA结合DES解决上下行接口的安全性问题相关推荐

  1. 防火墙的双机热备技术(上下行接口连接二层设备)

    拓补图: 1. IP地址的配置,略 2. 防火墙区域的划分略,可以参考之前的双机热备那篇文章 3. 安全策略的配置略,为了演示效果我是默认放行全部 4. VRRP的配置,双防火墙之间创建两组不同的VR ...

  2. 防火墙的双机热备技术(上下行接口连接三层设备)

    拓补图: 1. IP地址的配置,略 2. 防火墙区域的划分略,可以参考之前的双机热备那篇文章,心跳接口属于DMZ区,内网接口属于turst,外网接口属于untrust 3. 安全策略的配置略,为了演示 ...

  3. 银行间本币市场上下行接口

    银行间本币市场由货币市场.债券市场及相关衍生品市场组成,是金融机构实施流动性管理.资产负债管理.投资交易管理及利率和信用风险管理的重要场所,也是央行货币政策传导的重要平台.

  4. 华为USG防火墙双机热备(业务口工作在三层上下行连接路由器)

    上一篇中防火墙上下行业务口工作在二层,VGMP可以通过VRRP来监控接口状态.那么如果上下行接口工作在三层,那么VGMP显然不能通过VRRP来监控接口状态此时就需要VGMP直接监控接口状态. 实验拓扑 ...

  5. 解决使用layui上传文件时提示“请求上传接口出现异常”

    在做网站的过程中,需要用户上传文件,接收文件的接口已经写好(经过测试确定可用) 现在需要在网页上提供一个文件上传的按钮.由于原生input type="file"组件太丑,考虑使用 ...

  6. 3个著名加密算法(MD5、RSA、DES)的解析

    MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来.     ...

  7. MD5、RSA、DES加密算法原理解析

    文章转自:http://www.iplaysoft.com/encrypt-arithmetic.html MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计 ...

  8. 计算机usb端口没反应,解决电脑USB接口没反应的小方法

    很多用户在使用电脑的时候,都需要用到移动设备等,但是不少用户在使用的过程中,总是会碰到各种问题.比如将U盘插入电脑的时候,电脑根本没有任何的反映,这是怎么回事呢?电脑USB接口没反应要怎么办?今天U大 ...

  9. 华为防火墙双机热备(三层上下行交换机)

    303.双机热备,三层上下行接交换机 实验topo: 实验步骤: 主墙的网络接口配置: 主墙安全域配置: 备墙网络接口配置: 备墙的安全与规划: 配置主墙的双机热备.心跳接口 配置主墙的虚拟IP地址: ...

最新文章

  1. 一文读懂机器学习“数据中毒”
  2. 最大流 ---- 最大不相交路径数 ---- P2766 最长不下降子序列问题(网络流24题)
  3. WACV 2020 | 基于2D卷积处理成本签名的快速立体匹配
  4. 备战金九银十,阿里P8师兄指导完整攻略(附:学习资料+面试宝典+项目实战笔记)
  5. 全能终端神器——MobaXterm
  6. spring和activemq的结合(五)
  7. 大页内存(HugePages)
  8. git 命令 clone分支的代码
  9. 蓝桥杯第九届省赛JAVA真题----螺旋折线
  10. java中Object和Objects类、toString方法和equals方法介绍
  11. CentOS - thin web server for Ruby(centos下安装thin,运行rails)
  12. 1.创建一个 Slim 应用
  13. linux 安装tomcat
  14. 微信小程序优惠券的购买和核销的操作流程设计
  15. 树莓派 --- 控制舵机转动代码Python
  16. 计算机科学之父——Alan Turing及相关电影介绍
  17. linux下好用的ftp,linux好用的ftp客户端
  18. 计算机管理属性被禁用,win7命令提示符提示已被系统管理员停用?
  19. BPMN 2.0规范
  20. 如何判断用户输入的邮箱格式是否正确?

热门文章

  1. 苹果听天由命 未雇佣游说公司处理欧盟补税案
  2. windows11切换输入法的快捷键是什么?win11怎样修改输入法快捷键
  3. 通讯录版本1.0到3.0简易版
  4. 看完张一鸣、王兴、雷军的600条语录,整理出给年轻人的50条建议!
  5. 邮政储蓄银行厦门分行经营管理系统 项目总结
  6. 雷军带出来的软件,阿里奖励20万,全靠友商衬托,和wps同步普及
  7. 四大展会将“亮剑”义乌 谱写贸易交流新“篇章”
  8. Vue 的属性、方法和生命周期
  9. 有哪些好的3D建模软件,最近对3D建模很感兴趣?
  10. C#在vs中吧数据流直接打印到txt文件