RSA结合DES解决上下行接口的安全性问题
原理请看: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. IP地址的配置,略 2. 防火墙区域的划分略,可以参考之前的双机热备那篇文章 3. 安全策略的配置略,为了演示效果我是默认放行全部 4. VRRP的配置,双防火墙之间创建两组不同的VR ...
- 防火墙的双机热备技术(上下行接口连接三层设备)
拓补图: 1. IP地址的配置,略 2. 防火墙区域的划分略,可以参考之前的双机热备那篇文章,心跳接口属于DMZ区,内网接口属于turst,外网接口属于untrust 3. 安全策略的配置略,为了演示 ...
- 银行间本币市场上下行接口
银行间本币市场由货币市场.债券市场及相关衍生品市场组成,是金融机构实施流动性管理.资产负债管理.投资交易管理及利率和信用风险管理的重要场所,也是央行货币政策传导的重要平台.
- 华为USG防火墙双机热备(业务口工作在三层上下行连接路由器)
上一篇中防火墙上下行业务口工作在二层,VGMP可以通过VRRP来监控接口状态.那么如果上下行接口工作在三层,那么VGMP显然不能通过VRRP来监控接口状态此时就需要VGMP直接监控接口状态. 实验拓扑 ...
- 解决使用layui上传文件时提示“请求上传接口出现异常”
在做网站的过程中,需要用户上传文件,接收文件的接口已经写好(经过测试确定可用) 现在需要在网页上提供一个文件上传的按钮.由于原生input type="file"组件太丑,考虑使用 ...
- 3个著名加密算法(MD5、RSA、DES)的解析
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来. ...
- MD5、RSA、DES加密算法原理解析
文章转自:http://www.iplaysoft.com/encrypt-arithmetic.html MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计 ...
- 计算机usb端口没反应,解决电脑USB接口没反应的小方法
很多用户在使用电脑的时候,都需要用到移动设备等,但是不少用户在使用的过程中,总是会碰到各种问题.比如将U盘插入电脑的时候,电脑根本没有任何的反映,这是怎么回事呢?电脑USB接口没反应要怎么办?今天U大 ...
- 华为防火墙双机热备(三层上下行交换机)
303.双机热备,三层上下行接交换机 实验topo: 实验步骤: 主墙的网络接口配置: 主墙安全域配置: 备墙网络接口配置: 备墙的安全与规划: 配置主墙的双机热备.心跳接口 配置主墙的虚拟IP地址: ...
最新文章
- 一文读懂机器学习“数据中毒”
- 最大流 ---- 最大不相交路径数 ---- P2766 最长不下降子序列问题(网络流24题)
- WACV 2020 | 基于2D卷积处理成本签名的快速立体匹配
- 备战金九银十,阿里P8师兄指导完整攻略(附:学习资料+面试宝典+项目实战笔记)
- 全能终端神器——MobaXterm
- spring和activemq的结合(五)
- 大页内存(HugePages)
- git 命令 clone分支的代码
- 蓝桥杯第九届省赛JAVA真题----螺旋折线
- java中Object和Objects类、toString方法和equals方法介绍
- CentOS - thin web server for Ruby(centos下安装thin,运行rails)
- 1.创建一个 Slim 应用
- linux 安装tomcat
- 微信小程序优惠券的购买和核销的操作流程设计
- 树莓派 --- 控制舵机转动代码Python
- 计算机科学之父——Alan Turing及相关电影介绍
- linux下好用的ftp,linux好用的ftp客户端
- 计算机管理属性被禁用,win7命令提示符提示已被系统管理员停用?
- BPMN 2.0规范
- 如何判断用户输入的邮箱格式是否正确?
热门文章
- 苹果听天由命 未雇佣游说公司处理欧盟补税案
- windows11切换输入法的快捷键是什么?win11怎样修改输入法快捷键
- 通讯录版本1.0到3.0简易版
- 看完张一鸣、王兴、雷军的600条语录,整理出给年轻人的50条建议!
- 邮政储蓄银行厦门分行经营管理系统 项目总结
- 雷军带出来的软件,阿里奖励20万,全靠友商衬托,和wps同步普及
- 四大展会将“亮剑”义乌 谱写贸易交流新“篇章”
- Vue 的属性、方法和生命周期
- 有哪些好的3D建模软件,最近对3D建模很感兴趣?
- C#在vs中吧数据流直接打印到txt文件