2018-2019 1 20165203 實驗五 通用協議設計

2018-2019 1 20165203 實驗五 通用協議設計

OpenSSL學習

  • 定義:OpenSSL是為網絡通信提供安全及數據完整性的一種安全協議,囊括了主要的密碼算法、常用的密鑰和證書封裝管理功能以及SSL協議,并提供了豐富的應用程序供測試或其它目的使用。
  • 基本功能:
    • 密碼算法庫
    • SSL協議庫
    • 應用程序
  • 其中:密碼算法庫是一個強大完整的密碼算法庫,它是OpenSSL的基礎部分,也是很值得一般密碼安全技術人員研究的部分,它實現了目前大部分主流的密碼算法和標準。主要包括對稱算法、非對稱算法、散列算法、數字簽名和認證、X509數字證書標準、PKCS12、PKCS7等標準。其他兩個功能部分SSL協議和應用程序都是基于這個庫開發的。
  • 在密碼算法庫的基礎上實現的,SSL協議部分完全實現和封裝了SSL協議的三個版本和TLS協議。使用協議庫,完全可以建立一個SSL服務器和SSL客戶端。
  • 應用程序是基于密碼算法庫和SSL協議庫實現的命令,熟悉OpenSSL可以從使用這些應用程序開始。應用程序覆蓋了密碼技術的應用,主要包括了各種算法的加密程序和各種類型密鑰的產生程序(如RSA、Md5、Enc等等)、證書簽發和驗證程序(如Ca、X509、Crl等)、SSL連接測試程序(如S_client和S_server等)以及其它的標準應用程序(如Pkcs12和Smime等)。

任務一

兩人一組
基于Socket實現TCP通信,一人實現服務器,一人實現客戶端
研究OpenSSL算法,測試對稱算法中的AES,非對稱算法中的RSA,Hash算法中的MD5
選用合適的算法,基于混合密碼系統實現對TCP通信進行機密性、完整性保護。
學有余力者,對系統進行安全性分析和改進。  
  • 實驗步驟:
    1.安裝Openssl。
  • 在虛擬機的Linux系統中前往Openssl官網,下載openssl-master.zip
  • 下載完畢后,利用unzip openssl-master.zip命令解壓,解壓后如圖所示。

1297630-20181216123643799-934363737.jpg

  • 利用如下命令進行安裝。
$ ./config
$ make
$ make test
$ make install  
  • 安裝完畢即可。

2.進行安裝測試。

  • 編寫一個測試代碼test_openssl.c
#include <stdio.h>
#include <openssl/evp.h>int main(){OpenSSL_add_all_algorithms();return 0;
}  
  • 使用命令gcc -o test_openssl test_openssl.c -L/usr/local/ssl/lib -lcrypto -ldl -lpthread進行編譯,生成“test_openssl”可執行文件,運行。接下來,執行echo $?,打印出的結果是0,則代表運行成功。
    1297630-20181216123716759-1833797132.jpg

  • 命令的學習:

-L選項——指定鏈接庫的文件夾地址;
-lcrypto——導入OpenSSL所需包;
-ldl選項——加載動態庫;
-lpthread選項——鏈接POSIX thread庫    

3.基于Socket實現TCP通信,實現服務器和客戶端的通信。連接后,如圖所示。

1297630-20181216123744957-1344884340.jpg

4.選用合適的算法,基于混合密碼系統實現對TCP通信進行機密性、完整性保護。

  • AES

編寫代碼aes.c


#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/aes.h>
#pragma comment(lib,"libeay32.lib")
int main(int argc, char **argv)
{unsigned char buf[512];unsigned char buf2[512];unsigned char buf3[512];unsigned char aes_keybuf[32];memset(buf,1,sizeof(buf));    memset(buf,0,sizeof(buf2));    memset(buf,0,sizeof(buf3));memset(aes_keybuf,0,sizeof(aes_keybuf));AES_KEY aeskey;AES_set_encrypt_key(aes_keybuf,256,&aeskey);for(int i=0;i<sizeof(buf);i+=16)AES_encrypt(buf+i,buf2+i,&aeskey);AES_set_decrypt_key(aes_keybuf,256,&aeskey);for(int i=0;i<sizeof(buf);i+=16)AES_decrypt(buf2+i,buf3+i,&aeskey);if(memcmp(buf,buf3,sizeof(buf))==0)printf("test success\r\n");elseprintf("test fail\r\n");
}  

使用gcc aes.c -o aes -L/usr/local/ssl/lib -lcrypto -ldl -lpthread進行編譯,并運行,運行完結果如圖所示。

1297630-20181216124001900-1498790812.jpg

  • RSA算法

編寫rsa.c


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/pem.h>
#include<openssl/err.h>
#define OPENSSLKEY "test.key"
#define PUBLICKEY "test_pub.key"
#define BUFFSIZE 1024
char* my_encrypt(char *str,char *path_key);//加密
char* my_decrypt(char *str,char *path_key);//解密
int main(void){char *source="I'm 20165203xyx who is a nice student.";char *ptr_en,*ptr_de;printf("source is    :%s\n",source);ptr_en=my_encrypt(source,PUBLICKEY);printf("after encrypt:%s\n",ptr_en);ptr_de=my_decrypt(ptr_en,OPENSSLKEY);printf("after decrypt:%s\n",ptr_de);if(ptr_en!=NULL){free(ptr_en);}   if(ptr_de!=NULL){free(ptr_de);}   return 0;
}
char *my_encrypt(char *str,char *path_key){char *p_en;RSA *p_rsa;FILE *file;int flen,rsa_len;if((file=fopen(path_key,"r"))==NULL){perror("open key file error");return NULL;    }   if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){ERR_print_errors_fp(stdout);return NULL;}   flen=strlen(str);rsa_len=RSA_size(p_rsa);p_en=(unsigned char *)malloc(rsa_len+1);memset(p_en,0,rsa_len+1);if(RSA_public_encrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_en,p_rsa,RSA_NO_PADDING)<0){return NULL;}RSA_free(p_rsa);fclose(file);return p_en;
}
char *my_decrypt(char *str,char *path_key){char *p_de;RSA *p_rsa;FILE *file;int rsa_len;if((file=fopen(path_key,"r"))==NULL){perror("open key file error");return NULL;}if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){ERR_print_errors_fp(stdout);return NULL;}rsa_len=RSA_size(p_rsa);p_de=(unsigned char *)malloc(rsa_len+1);memset(p_de,0,rsa_len+1);if(RSA_private_decrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_de,p_rsa,RSA_NO_PADDING)<0){return NULL;}RSA_free(p_rsa);fclose(file);return p_de;
}  

同樣的方法編譯運行,得到結果,成功。

  • MD5算法。
#define _GNU_SOURCE#include <stdio.h>#include <string.h>#include <stdlib.h>#include <errno.h>#include <ctype.h>#include "openssl/md5.h"MD5_CTX  md5_ctx;
static int MD5mod(const char* str, int length, int mod){char sign[16] = {0};MD5_Init(&md5_ctx);MD5_Update(&md5_ctx, str, length);MD5_Final(sign, &md5_ctx);printf("digest:%s\n",sign);int sum = 0;for (int i=0; i < 16; i ++) {sum += (sign[i]&0xff);}int offset = sum % mod;return offset;}int main(int argc, char** argv){if( argc < 4){fprintf(stderr, "%s num infile outfile\n", argv[0]);exit(-1);}int num = atoi(argv[1]) ;if( num <= 0){fprintf(stderr, "ERROR: num error: %s\n", argv[1]);exit(-1);}FILE* in = fopen(argv[2], "r");if( in == NULL){perror("fopen");fprintf(stderr, "ERROR: infile error: %s\n", argv[2]);exit(-1);}FILE** OUT = (FILE**)malloc(sizeof(FILE*) * num);for(int i=0; i<num; ++i){char buf[256] = {0};sprintf(buf, "%s_%d", argv[3], i);OUT[i] = fopen(buf, "w");if( OUT[i] == NULL){perror("fopen");fprintf(stderr, "ERROR: infile error: %s\n", argv[2]);exit(-1);}}size_t len = 0;ssize_t read;char * line = NULL;while ((read = getline(&line, &len, in)) != -1) {int  klen = 0;while( klen < read ){if( isspace( *(line+klen)) ) break;klen++;}//   char id[256]={0};//   strncpy(id, line, klen);//   printf("id=%s\tklen=%d\tread=%ld\tline=%s", id, klen, read, line);fprintf(OUT[MD5mod(line, klen, num)], "%s", line);}if(line) free(line);return 0;
}  

編譯運行,如圖所示。

1297630-20181216124034999-330290801.jpg

任務二

在Ubuntu中實現對實驗二中的“wc服務器”通過混合密碼系統進行防護
提交測試截圖  
  1. 學習wc服務器模式如下。

1297630-20181216124059502-331994892.png

  1. 編寫代碼如下。

server.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>#include <openssl/evp.h>#define MAXBUF 1024int main(int argc, char **argv)
{int sockfd, new_fd;socklen_t len;struct sockaddr_in my_addr, their_addr;unsigned int myport, lisnum;char buf[MAXBUF + 1];SSL_CTX *ctx;if (argv[1])myport = atoi(argv[1]);elsemyport = 5227;if (argv[2])lisnum = atoi(argv[2]);elselisnum = 2;/* SSL 庫初始化 */SSL_library_init();/* 載入所有 SSL 算法 */OpenSSL_add_all_algorithms();/* 載入所有 SSL 錯誤消息 */SSL_load_error_strings();/* 以 SSL V2 和 V3 標準兼容方式產生一個 SSL_CTX ,即 SSL Content Text */ctx = SSL_CTX_new(SSLv23_server_method());/* 也可以用 SSLv2_server_method() 或 SSLv3_server_method() 單獨表示 V2 或 V3標準 */if (ctx == NULL) {ERR_print_errors_fp(stdout);exit(1);}/* 載入用戶的數字證書, 此證書用來發送給客戶端。 證書里包含有公鑰 */if (SSL_CTX_use_certificate_file(ctx, argv[3], SSL_FILETYPE_PEM) <= 0) {ERR_print_errors_fp(stdout);exit(1);}/* 載入用戶私鑰 */if (SSL_CTX_use_PrivateKey_file(ctx, argv[4], SSL_FILETYPE_PEM) <= 0){ERR_print_errors_fp(stdout);exit(1);}/* 檢查用戶私鑰是否正確 */if (!SSL_CTX_check_private_key(ctx)) {ERR_print_errors_fp(stdout);exit(1);}/* 開啟一個 socket 監聽 */if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);} elseprintf("socket created\n");bzero(&my_addr, sizeof(my_addr));my_addr.sin_family = PF_INET;my_addr.sin_port = htons(myport);my_addr.sin_addr.s_addr = INADDR_ANY;if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))== -1) {perror("bind");exit(1);} elseprintf("binded\n");if (listen(sockfd, lisnum) == -1) {perror("listen");exit(1);} elseprintf("begin listen\n");while (1) {SSL *ssl;len = sizeof(struct sockaddr);/* 等待客戶端連上來 */if ((new_fd =accept(sockfd, (struct sockaddr *) &their_addr,&len)) == -1) {perror("accept");exit(errno);} elseprintf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port), new_fd);/* 基于 ctx 產生一個新的 SSL */ssl = SSL_new(ctx);/* 將連接用戶的 socket 加入到 SSL */SSL_set_fd(ssl, new_fd);/* 建立 SSL 連接 */if (SSL_accept(ssl) == -1) {perror("accept");close(new_fd);break;}/* 開始處理每個新連接上的數據收發 */bzero(buf, MAXBUF + 1);strcpy(buf, "hello");/* 發消息給客戶端 */len = SSL_write(ssl, buf, strlen(buf));if (len <= 0) {printf("消息'%s'發送失敗!錯誤代碼是%d,錯誤信息是'%s'\n",buf, errno, strerror(errno));goto finish;} elseprintf("消息'%s'發送成功,共發送了%d個字節!\n",buf, len);bzero(buf, MAXBUF + 1);/* 接收客戶端的消息 */len = SSL_read(ssl, buf, MAXBUF);if (len > 0)printf("接收消息成功:'%s',共%d個字節的數據\n",buf, len);elseprintf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n",errno, strerror(errno));/* 處理每個新連接上的數據收發結束 */finish:/* 關閉 SSL 連接 */SSL_shutdown(ssl);/* 釋放 SSL */SSL_free(ssl);/* 關閉 socket */close(new_fd);}/* 關閉監聽的 socket */close(sockfd);/* 釋放 CTX */SSL_CTX_free(ctx);return 0;
}  

talent.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>#include <openssl/evp.h>#define MAXBUF 1024int main(int argc, char **argv)
{int sockfd, new_fd;socklen_t len;struct sockaddr_in my_addr, their_addr;unsigned int myport, lisnum;char buf[MAXBUF + 1];SSL_CTX *ctx;if (argv[1])myport = atoi(argv[1]);elsemyport = 5227;if (argv[2])lisnum = atoi(argv[2]);elselisnum = 2;/* SSL 庫初始化 */SSL_library_init();/* 載入所有 SSL 算法 */OpenSSL_add_all_algorithms();/* 載入所有 SSL 錯誤消息 */SSL_load_error_strings();/* 以 SSL V2 和 V3 標準兼容方式產生一個 SSL_CTX ,即 SSL Content Text */ctx = SSL_CTX_new(SSLv23_server_method());/* 也可以用 SSLv2_server_method() 或 SSLv3_server_method() 單獨表示 V2 或 V3標準 */if (ctx == NULL) {ERR_print_errors_fp(stdout);exit(1);}/* 載入用戶的數字證書, 此證書用來發送給客戶端。 證書里包含有公鑰 */if (SSL_CTX_use_certificate_file(ctx, argv[3], SSL_FILETYPE_PEM) <= 0) {ERR_print_errors_fp(stdout);exit(1);}/* 載入用戶私鑰 */if (SSL_CTX_use_PrivateKey_file(ctx, argv[4], SSL_FILETYPE_PEM) <= 0){ERR_print_errors_fp(stdout);exit(1);}/* 檢查用戶私鑰是否正確 */if (!SSL_CTX_check_private_key(ctx)) {ERR_print_errors_fp(stdout);exit(1);}/* 開啟一個 socket 監聽 */if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(1);} elseprintf("socket created\n");bzero(&my_addr, sizeof(my_addr));my_addr.sin_family = PF_INET;my_addr.sin_port = htons(myport);my_addr.sin_addr.s_addr = INADDR_ANY;if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))== -1) {perror("bind");exit(1);} elseprintf("binded\n");if (listen(sockfd, lisnum) == -1) {perror("listen");exit(1);} elseprintf("begin listen\n");while (1) {SSL *ssl;len = sizeof(struct sockaddr);/* 等待客戶端連上來 */if ((new_fd =accept(sockfd, (struct sockaddr *) &their_addr,&len)) == -1) {perror("accept");exit(errno);} elseprintf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port), new_fd);/* 基于 ctx 產生一個新的 SSL */ssl = SSL_new(ctx);/* 將連接用戶的 socket 加入到 SSL */SSL_set_fd(ssl, new_fd);/* 建立 SSL 連接 */if (SSL_accept(ssl) == -1) {perror("accept");close(new_fd);break;}/* 開始處理每個新連接上的數據收發 */bzero(buf, MAXBUF + 1);strcpy(buf, "hello");/* 發消息給客戶端 */len = SSL_write(ssl, buf, strlen(buf));if (len <= 0) {printf("消息'%s'發送失敗!錯誤代碼是%d,錯誤信息是'%s'\n",buf, errno, strerror(errno));goto finish;} elseprintf("消息'%s'發送成功,共發送了%d個字節!\n",buf, len);bzero(buf, MAXBUF + 1);/* 接收客戶端的消息 */len = SSL_read(ssl, buf, MAXBUF);if (len > 0)printf("接收消息成功:'%s',共%d個字節的數據\n",buf, len);elseprintf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n",errno, strerror(errno));/* 處理每個新連接上的數據收發結束 */finish:/* 關閉 SSL 連接 */SSL_shutdown(ssl);/* 釋放 SSL */SSL_free(ssl);/* 關閉 socket */close(new_fd);}/* 關閉監聽的 socket */close(sockfd);/* 釋放 CTX */SSL_CTX_free(ctx);return 0;
}  
  1. 編譯運行。
  • 使用gcc -o server server.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread編譯server.c
  • 使用gcc -o telent telent.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
  • 使用openssl genrsa -out privkey.pem 1024 openssl req -new -x509 -key privkey.pem -out CAcert.pem -days 1095來生產私鑰和證書。
  • 使用./server 5203 1 CAcert.pem privkey.pem ./telent 127.0.0.1 5203來運行。

運行后如圖所示。

1297630-20181216124143645-1449725082.jpg

實驗中出現的問題及解答。

Q1:安裝openssl時出現如圖所示問題。

1297630-20181216124248551-55755620.jpg

A1:將“openssl-master”文件夾下的“libcrypto.a”“libssl.a”放在/usr/local/ssl/lib目錄下(注意使用sudo權限),編譯時鏈接這個目錄即可。

Q2:編譯任務2時出現如圖所示問題。

1297630-20181216124322655-1296351604.jpg

A2:要使用命令gcc -o server server.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread來進行相應的庫鏈接。

實驗感想

本次實驗我們主要學習了Openssl的主要內容結構和用法,該實驗還與計算機網絡和密碼學的相關知識結合起來,更符合我們信息安全專業的特點,也學到了很多知識。
本學期該課的實驗就要結束了,但是學習知識的腳步要永遠進行著,生命不息,學習不止,只有不斷學習新知識才會一直進步。

轉載于:https://www.cnblogs.com/20165203-xyx/p/10126214.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248813.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

弄懂webpack,只要看這一片就夠了(文末有福利)

什么是webpack ? webpack是什么&#xff0c;官網中是這么說的。 ? 本質上&#xff0c;webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)。當 webpack 處理應用程序時&#xff0c;它會遞歸地構建一個依賴關系圖(dependency graph)&#xff0c;其中包…

beta沖刺總結那周余嘉熊掌將得隊

作業格式 課程名稱&#xff1a;軟件工程1916|W&#xff08;福州大學&#xff09;作業要求&#xff1a;項目Beta沖刺團隊名稱&#xff1a; 那周余嘉熊掌將得隊作業目標&#xff1a;beta沖刺總結隊員學號隊員姓名博客地址備注221600131Jaminhttps://www.cnblogs.com/JaminWu/隊長…

在Winform中菜單動態添加“最近使用文件”

最近在做文件處理系統中&#xff0c;要把最近打開文件顯示出來&#xff0c;方便用戶使用。網上資料有說&#xff0c;去遍歷“C:\Documents and Settings\Administrator\Recent”下的最近文檔本。文主要介紹在Winform界面菜單中實現【最近使用的文件】動態菜單的處理&#xff0c…

Vue組件通信原理剖析(一)事件總線的基石 $on和$emit

首先我們先從一個面試題入手。 面試官問&#xff1a; “Vue中組件通信的常用方式有哪些&#xff1f;” 我答&#xff1a; 1. props 2. 自定義事件 3. eventbus 4. vuex 5. 還有常見的邊界情況$parent、$children、$root、$refs、provide/inject 6. 此外還有一些非props特性$att…

display:flex彈性布局

一、背景 前段時間幫公司運維小姑娘調整她自己寫的頁面樣式時發現她用了display: flex&#xff0c;我這個后端老古董還不太懂flex&#xff0c;自愧不如啊&#xff0c;所以寫篇博客記錄學習下。 現在寫的前端頁面還停留在依賴 display 屬性 position屬性 float屬性的布局方式&…

一些好的思維方式

定理s 一、墨菲定律 觀點&#xff1a;1.任何事都沒有表面看起來那么簡單&#xff1b;2.所有的事都會比你預計的時間長&#xff1b;3.會出錯的事總會出錯&#xff1b;4.如果你擔心某種情況發生&#xff0c;那么它就更有可能發生。 墨菲定律的核心觀點就4點&#xff0c;不算復雜&…

Vue組件通信原理剖析(二)全局狀態管理Vuex

首先我們先從一個面試題入手。 面試官問&#xff1a; “Vue中組件通信的常用方式有哪些&#xff1f;” 我答&#xff1a; 1. props 2. 自定義事件 3. eventbus 4. vuex 5. 還有常見的邊界情況$parent、$children、$root、$refs、provide/inject 6. 此外還有一些非props特性$att…

初識單點登錄及JWT實現

單點登錄 多系統&#xff0c;單一位置登錄&#xff0c;實現多系統同時登錄的一種技術 &#xff08;三方登錄&#xff1a;某系統使用其他系統的用戶&#xff0c;實現本系統登錄的方式。如微信登錄、支付寶登錄&#xff09; 單點登錄一般是用于互相授信的系統&#xff0c;實現單一…

Vue組件通信原理剖析(三)provide/inject原理分析

首先我們先從一個面試題入手。 面試官問&#xff1a; “Vue中組件通信的常用方式有哪些&#xff1f;” 我答&#xff1a; 1. props 2. 自定義事件 3. eventbus 4. vuex 5. 還有常見的邊界情況$parent、$children、$root、$refs、provide/inject 6. 此外還有一些非props特性$att…

iMX6開發板-uboot-網絡設置和測試

本文章基于迅為IMX6開發板 將iMX6開發板通過網線連接到路由器&#xff0c;同時連接好調試串口&#xff0c;上電立即按 enter&#xff0c;即可進入 uboot。然后輸入命令 pri&#xff0c;查看開發板當前的配置&#xff0c;如下圖所示可以看到 ip 地址、子網掩碼 等信息。 本文檔測…

Django ajax 檢測用戶名是否已被注冊

添加一個 register.html 頁面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form><p>用戶名<input id"username" type&…

pyqt5控件

背景色設置 self.tab.setStyleSheet("background: rgb(238, 233, 233)") self.but_0.setStyleSheet("background: rgb(0, 255, 255)")樣式&#xff1a; self.but_0.setStyle(QStyleFactory.create("Windows"))字體&#xff1a; self.lineEdit.se…

詳解JDBC連接數據庫

一、概念 1. 為了能讓程序操作數據庫&#xff0c;對數據庫中的表進行操作&#xff0c;每一種數據庫都會提供一套連接和操作該數據庫的驅動&#xff0c;而且每種數據庫的驅動都各不相同&#xff0c;例如mysql數據庫使用mysql驅動&#xff0c;oracle數據庫使用oracle驅動&#xf…

ASP.NET MVC 自定義模型綁定1 - 自動把以英文逗號分隔的 ID 字符串綁定成 Listint...

直接貼代碼了&#xff1a; CommaSeparatedModelBinder.cs using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Web.Mvc;namespace MvcSample.Extensions {public class CommaSeparatedMode…

ZOJ4024 Peak

題意 給出一個數組 判斷這個數組是否形成了一個“山峰” 即中間有個數最大 從第一個數到這個數遞增 從這個數到最后一個數遞減 模擬 從兩端分別以遞增和遞減判斷 看第一個不滿足遞增或遞減的數是否相等并且沒越界就可以了 AC代碼&#xff1a; 1 #include<bits/stdc.h>2 u…

基本數據類型與String之間的轉換

字符串轉基本數據類型 調用基本數據類型對應的包裝類中的方法parseXXX(String)或valueOf(String)即可返回相應基本類型。 基本數據類型轉字符串 一種方法是將基本數據類型與空字符串&#xff08;""&#xff09;連接&#xff08;&#xff09;即可獲得其所對應的字符串…

springmvc跨域問題

1、跨域問題&#xff1a; 按照網上所有的方法試了一遍&#xff0c;都沒跨過去&#xff0c;正在無助之際&#xff0c;使用filter按照下面的方法解決的時候出現了轉機&#xff1a; 添加filter&#xff1a; package com.thc.bpm.filter;import javax.servlet.*; import javax.serv…

柳傳志給年輕人的建議:比起過日子,更要奔日子

改革開放的 40 年&#xff0c;是柳傳志實現人生價值的 40 年。 十一屆三中全會后&#xff0c;伴隨“科學的春天”&#xff0c;迎著改革開放的大潮&#xff0c;柳傳志“下海”了。但他并沒想到&#xff0c;自己選擇的電腦行業&#xff0c;讓他和聯想集團站在了潮頭。 從 1984 年…

成功秀了一波scala spark ML邏輯斯蒂回歸

1、直接上官方代碼&#xff0c;調整過的&#xff0c;方可使用 package com.test import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS} import org.apache.spark.mllib.e…

記錄一次查詢log的經歷

一大早發現生產數據庫的基礎資料被刪除。 由于每天都做了差異備份&#xff0c;而且是基礎資料&#xff0c;這樣數據就不會擔心找不回來。 首先通過每天的差異本分文件進行查看數據丟失的大概時間&#xff0c;查到數據丟失是在17晚上備份過后18丟失的。 然后找18號的數據庫執行記…