Delphi RSA加解密(二)

news2024/9/29 11:39:37

dll开发环境: Delphi XE 10.1 Berlin

exe开发环境: Delphi 6

前提文章: Delphi RSA加解密(一)

目录

1. 概述

2. 准备工作

        2.1 下载DEMO程序

        2.2 字符编码说明

3. Cryption.dll封装

        3.1 接口概况

        3.2 uPub.pas单元代码

        3.3 uInterface.pas单元代码

        3.4 特别注意

4. 主程序模拟

        4.1 程序目录结构说明

        4.2 建立VCL应用程序

        4.3 接口引入单元

        4.4 接口加密验证

5. 结语


1. 概述

        公司用D6来编写三方接口,当前做某银行转账接口,采用RSA算法。在上一篇文章Delphi RSA加解密(一)中在网上找到了解决方案。

        D6版本低了,所有只有采用XE 10.1来封装dll。当前加密算法基于opelSSL,则依赖"libeay32.dll", 由于HIS程序目录下已有该dll,担心替换libeay32.dll会影响相关功能,特进行了特殊处理。

2. 准备工作

        2.1 下载DEMO程序

        在前提文章中提到了大佬分享的Demo. 下载后会发现bin目录有libeay32.dll。 这个文件很关键,后来我调试中,我使用XE 10.1对应的libeay32.dll文件,加密是不成功的。 但使用Demo的libeay32.dll进行加解密是正常的。

        2.2 字符编码说明

        原Demo的Delphi版本不确定,至少是D2010以后,版本太多了。

        悲催的是,我只有XE 10.1,下了Demo后进行部分调整。

3. Cryption.dll封装

        3.1 接口概况

        该dll开发工具我使用Delphi XE 10.1 Berlin版本.

        新建一个静态DLL工程,将原Demo的三个单元RSAOpenSSL.pas、libeay32.pas、EncdDecd_suman.pas拷贝到当前rsa目录下. 并加入当前dll工程. 另新建一个uPub.pas公共单元,新建一个uInterface.pas单元。工程目录如下

        

        具体代码在后面,相信当前还在使用Delphi的,应该已能看懂的。

        3.2 uPub.pas单元代码

unit uPub;

interface

uses
  System.SysUtils, System.Classes, qaes, qstring, IdHashMessageDigest, IdHash;

type
  TMD5= class(TIdHashMessageDigest5);

  TAppPara = class
  public
    class function AppPath: string;
    class function AppName: string;
  end;

  TFilePath = class(TAppPara)
  public
    class function IniFile: string;
  end;

//写日志
procedure systemLog(Msg: AnsiString);

implementation

procedure systemLog(Msg: AnsiString);
var
  F: TextFile;
  FileName: string;
  ExeRoad: string;
begin
  try
    ExeRoad := ExtractFilePath(ParamStr(0));
    if ExeRoad[Length(ExeRoad)] = '\' then
      SetLength(ExeRoad, Length(ExeRoad) - 1);
    if not DirectoryExists(ExeRoad + 'log') then
    begin
      CreateDir(ExeRoad + '\log');
    end;
    FileName := ExeRoad + '\log\DLL_Log' + FormatDateTime('YYMMDD', NOW) + '.txt';
    if not FileExists(FileName) then
    begin
      AssignFile(F, FileName);
      ReWrite(F);
    end
    else
      AssignFile(F, FileName);
    Append(F);
    Writeln(F, FormatDateTime('HH:NN:SS.zzz ', Now) + Msg);
    CloseFile(F);
  except
    //可能在事务中调用,避免意外
    Exit;
  end;
end;

{ TAppPara }

class function TAppPara.AppName: string;
begin
  Result := ExtractFileName(ParamStr(0));
end;

class function TAppPara.AppPath: string;
begin
  Result := ExtractFilePath(ParamStr(0));
end;

{ TFilePath }

class function TFilePath.IniFile: string;
begin
  Result := AppPath + 'set.ini';
end;

end.

        3.3 uInterface.pas单元代码

        需要注意,由于D6版本低,此处参数使用PAnsiChar。

unit uInterface;

interface

uses
  Winapi.Windows, System.SysUtils, System.Classes, EncdDecd, Qjson,
  RSAOpenSSL;

var
  FRSAOpenSSL : TRSAOpenSSL;

//----------------------------------测试部分------------------------------------
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//测试
function dll_test: Byte; stdcall;

function dll_chinese_test(sIn: AnsiString; var sOut: PAnsiChar): Byte; stdcall;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

//----------------------------------加密部分------------------------------------
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//RSA 加密 初始化
function dll_rsa_init(pubFile, priFile: PAnsiChar): Byte; stdcall;

//RSA SHA1加密
function dll_sha1_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;

//RSA SHA256加密
function dll_sha256_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;

//RSA SHA512加密
function dll_sha512_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;

//RSA SHA1WITHRSA 加密
function dll_sha1withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;

//RSA SHA256WITHRSA 加密
function dll_sha256withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;

//RSA SHA512WITHRSA 加密
function dll_sha512withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;

//RSA 加密 释放
function dll_rsa_uninit: Byte; stdcall;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



implementation

uses uPub, qaes;

//----------------------------------测试部分------------------------------------
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//测试
function dll_test: Byte; stdcall;
begin
  Result:= 1;
end;

function dll_chinese_test(sIn: AnsiString; var sOut: PAnsiChar): Byte; stdcall;
begin
  result:= 0;
  sOut:= PAnsiChar(sIn);
  Result:= 1;
end;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

//RSA 加密 初始化
function dll_rsa_init(pubFile, priFile: PAnsiChar): Byte; stdcall;
begin
  result:= 0;
  if (not FileExists(priFile))
    or (not FileExists(pubFile)) then
    Exit;
  if not Assigned(FRSAOpenSSL) then
    FRSAOpenSSL := TRSAOpenSSL.Create(AnsiString(pubFile), AnsiString(priFile));
  Result:= 1;
end;

//RSA SHA1加密
function dll_sha1_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
var
  sAnsiStr: AnsiString;
  sOut: AnsiString;
begin
  result:= 0;
  sAnsiStr:= UTF8Encode(sIN);
  sOut:= FRSAOpenSSL.SHA1(sAnsiStr);
  pOut:= PAnsiChar(sOut);
  Result:= 1;
end;

//RSA SHA256加密
function dll_sha256_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
var
  sAnsiStr: AnsiString;
  sOut: AnsiString;
begin
  result:= 0;
  sAnsiStr:= UTF8Encode(sIN);
  sOut:= FRSAOpenSSL.SHA256(sAnsiStr);
  pOut:= PAnsiChar(sOut);
  Result:= 1;
end;

//RSA SHA512加密
function dll_sha512_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
var
  sAnsiStr: AnsiString;
  sOut: AnsiString;
begin
  result:= 0;
  sAnsiStr:= UTF8Encode(sIN);
  sOut:= FRSAOpenSSL.SHA512(sAnsiStr);
  pOut:= PAnsiChar(sOut);
  Result:= 1;
end;

//RSA SHA1WITHRSA 加密
function dll_sha1withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
var
  sAnsiStr: AnsiString;
  sOut: AnsiString;
begin
  result:= 0;
  sAnsiStr:= UTF8Encode(sIn);
  sOut:= FRSAOpenSSL.SHA1_Sign_PK(sAnsiStr);
  pOut:= PAnsiChar(sOut);
  Result:= 1;
end;

//RSA SHA256WITHRSA 加密
function dll_sha256withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
var
  sAnsiStr: AnsiString;
  sOut: AnsiString;
begin
  result:= 0;
  sAnsiStr:= UTF8Encode(sIn);
  sOut:= FRSAOpenSSL.SHA256_Sign_PK(sAnsiStr);
  pOut:= PAnsiChar(sOut);
  Result:= 1;
end;

//RSA SHA512WITHRSA 加密
function dll_sha512withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
var
  sAnsiStr: AnsiString;
  sOut: AnsiString;
begin
  result:= 0;
  sAnsiStr:= UTF8Encode(sIn);
  sOut:= FRSAOpenSSL.SHA512_Sign_PK(sAnsiStr);
  pOut:= PAnsiChar(sOut);
  Result:= 1;
end;

//RSA 加密 释放
function dll_rsa_uninit: Byte; stdcall;
begin
  Result:= 0;
  if Assigned(FRSAOpenSSL) then
    FreeAndNil(FRSAOpenSSL);
  Result:= 1;
end;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

end.

        3.4 特别注意

        在第四章我提到了程序目录(原因请看4.1),而libeay32.pas单元的第1290行,这个里引入了libeay32.dll,但是在,在我当前设计的目录里,Cryption.dll是和libeay32.dll放在程序目录下的bin目录下,通过Demo程序调用的话,程序认定的目录其实是程序根目录,所以在这里必须特殊处理下,加入路劲:

const
  LIBEAY_DLL_NAME = 'bin\libeay32.dll';

        如果编写dll与主程序同一个目录,不担心加密的libeay32.dll影响的话,就放在程序目录下就可以了。

4. 主程序模拟

        注意: SHA1WITHRSA、SHA256WITHRSA、SHA512WITHRSA需要公私钥的支持.

        4.1 程序目录结构说明

        在文章开始部分,我已说明使用Demo的libeay32.dll可能与主程序原本的libeay32.dll冲突,所以,第三章封装的Cryptiond.dll和libeay32.dll,以及可能用到的公私钥文件,我一起放在程序的某个目录下。

        

bin目录如下所示

        

 

        4.2 建立VCL应用程序

        丢下控件,界面如图所示:

 主要是初始化时候,我指定了公私钥文件,就像Demo里窗体创建一样。

主窗体代码如下:

unit uFrmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, EncdDecd;

type
  TForm2 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    btn4: TButton;
    btn5: TButton;
    btn6: TButton;
    btn7: TButton;
    btn8: TButton;
    lbl1: TLabel;
    lbl2: TLabel;
    mmo_in: TMemo;
    mmo_out: TMemo;
    procedure btn1Click(Sender: TObject);
    procedure btn8Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn6Click(Sender: TObject);
    procedure btn7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    priFile: AnsiString;
    pubFile: AnsiString;
  end;

var
  Form2: TForm2;
  iRet: Byte;

implementation

uses uCryption;

{$R *.dfm}

procedure TForm2.btn1Click(Sender: TObject);
begin
  iRet:= 0;
  pubFile:= 'bin\apprsakey.pub';
  priFile:= 'bin\apprsakey.pri';
  iRet:= dll_rsa_init(PChar(pubFile), PChar(priFile));
  if iRet<> 1 then
    ShowMessage('初始化失败!')
end;

procedure TForm2.btn8Click(Sender: TObject);
begin
  iRet:= 0;
  iRet:= dll_rsa_uninit;
  if iRet= 1 then
    ShowMessage('释放成功!')
  else
    ShowMessage('释放失败!')
end;

procedure TForm2.btn2Click(Sender: TObject);
var
  pOut: PChar;
  sIn: string;
begin
  sIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);
  iRet:= 0;
  pOut:= nil;
  iRet:= dll_sha1_encrypt(PChar(sIn), pOut);
  if iRet=1 then
    mmo_out.Lines.Add(pOut)
  else
    ShowMessage('dll_sha1_encrypt加密失败!');
  pOut:= nil;
end;

procedure TForm2.btn5Click(Sender: TObject);
var
  pOut: PChar;
  sIn: string;
begin
  sIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);
  iRet:= 0;
  pOut:= nil;
  iRet:= dll_sha1withrsa_encrypt(PChar(sIn), pOut);
  if iRet=1 then
    mmo_out.Lines.Add(pOut)
  else
    ShowMessage('dll_sha1withrsa_encrypt加密失败!');
  pOut:= nil;
end;

procedure TForm2.btn3Click(Sender: TObject);
var
  pOut: PChar;
  sIn: string;
begin
  sIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);
  iRet:= 0;
  pOut:= nil;
  iRet:= dll_sha256_encrypt(PChar(sIn), pOut);
  if iRet=1 then
    mmo_out.Lines.Add(pOut)
  else
    ShowMessage('dll_sha256_encrypt加密失败!');
  pOut:= nil;
end;

procedure TForm2.btn4Click(Sender: TObject);
var
  pOut: PChar;
  sIn: string;
begin
  sIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);
  iRet:= 0;
  pOut:= nil;
  iRet:= dll_sha512_encrypt(PChar(sIn), pOut);
  if iRet=1 then
    mmo_out.Lines.Add(pOut)
  else
    ShowMessage('dll_sha512_encrypt加密失败!');
  pOut:= nil;
end;

procedure TForm2.btn6Click(Sender: TObject);
var
  pOut: PChar;
  sIn: string;
begin
  sIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);
  iRet:= 0;
  pOut:= nil;
  iRet:= dll_sha256withrsa_encrypt(PChar(sIn), pOut);
  if iRet=1 then
    mmo_out.Lines.Add(pOut)
  else
    ShowMessage('dll_sha256withrsa_encrypt加密失败!');
  pOut:= nil;
end;

procedure TForm2.btn7Click(Sender: TObject);
var
  pOut: PChar;
  sIn: string;
begin
  sIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);
  iRet:= 0;
  pOut:= nil;
  iRet:= dll_sha512withrsa_encrypt(PChar(sIn), pOut);
  if iRet=1 then
    mmo_out.Lines.Add(pOut)
  else
    ShowMessage('dll_sha512withrsa_encrypt加密失败!');
  pOut:= nil;
end;

end.

        4.3 接口引入单元

        需要注意dllName是按目录指定dll位置.

unit uCryption;

interface

uses
  Classes;

const
  dllName= 'bin\Cryption.dll';

  function dll_chinese_test(sIn: AnsiString; var sOut: PAnsiChar): Byte; stdcall; external dllName;


  //RSA 加密 初始化
  function dll_rsa_init(pubFile, priFile: PChar): Byte; stdcall; external dllName;

  //RSA SHA1加密
  function dll_sha1_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;

  //RSA SHA256加密
  function dll_sha256_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;

  //RSA SHA512加密
  function dll_sha512_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;

  //RSA SHA1WITHRSA 加密
  function dll_sha1withrsa_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;

  //RSA SHA256WITHRSA 加密
  function dll_sha256withrsa_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;

  //RSA SHA512WITHRSA 加密
  function dll_sha512withrsa_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;

  //RSA 加密 释放
  function dll_rsa_uninit: Byte; stdcall; external dllName;

implementation

end.

        4.4 接口加密验证

        在线SHA1 SHA-1在线加密工具 与Demo加密对比

        

 

        在线SHA256 sha256在线解密 在线加密 与Demo加密对比

        

 

        在线SHA512可验证 sha512在线解密 在线加密 与Demo加密对比

        另 SHA1WITHRSA、SHA256WITHRSA、SHA512WITHRSA在线验证不好找

        后面我本地写个对照下看看,后面补充.

5. 结语

        仅供参考。

       

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/370923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择合适的数字隔离器

随着数字隔离器在工业和汽车应用中的日益普及&#xff0c;从众多可用选项中选择最适合您系统的器件可能会让人不知所措。除了这一挑战之外&#xff0c;大多数数字隔离器在设计时都考虑了特定的系统要求和应用&#xff0c;让您需要对无穷无尽的规格和功能进行分类&#xff0c;以…

C++ sting类(一)各类操作

1、 C语言中的字符串C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合程序设计的思想&#xff0c;而且底层空间需要用户自己管…

NEXUS 6P刷机安装Edxposed

刷机 abd等工具下载&#xff1a; https://developer.android.com/studio/releases/platform-tools?hlzh-cn 下载后配置环境变量 镜像下载&#xff1a; https://developers.google.com/android/images?hlzh-cn#angler Magisk下载 GitHub - topjohnwu/Magisk: The Magic M…

基于BP神经网络的衣服识别,BP神经网络详细原理,BP神经网络图像识别神经网络案例之19

目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数&#xff0c; BP神经网络的传递函数 数据 神经网络参数 基于BP神经网络 性别识别的MATLAB代码 效果图 结果分析 展望 背影 人靠衣服马靠鞍&#xff0c;通过穿衣可…

Matlab字符串相关操作-拼接、格式化

常见的有三种方法&#xff1a;向量拼接、strcat函数和sprintf函数1、向量拼接在matlab中字符串本质上也是一个向量&#xff0c;可以通过矩阵运算来实现字符串的拼接&#xff0c;这里随便输入两个字符串a1和b1&#xff0c;用矩阵形式进行拼接&#xff1a;a1 I love;b1 Matlab…

Web项目部署环境搭建:JDK + Tomcat + IDEA

Web项目部署环境搭建&#xff1a;JDK Tomcat IDEA1.java JDK1.1 下载安装1.2 配置环境变量1.3 检查安装成功2. TomCat2.1 下载安装2.2 配置环境变量2.3 检查安装成功3.IDEA3.1 下载安装3.2 永久可得3.3 IDEA部署Tomcat出来混总是要还的&#xff0c;记得大学本科四年&#xff…

Protobuf 逆向解析两种方法

Protobuf 逆向解析两种方法一、Protobuf 的特征二、解析.bin文件显示原始数据法一&#xff1a;用 blackboxprotobuf 模块解析法二&#xff1a;使用 protoc 解析工具一、Protobuf 的特征 案例网址 Protocol buffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法&…

计算机网络 — UDP协议(看这一篇就可以

UDP协议UDP是传输层的重要协议之一&#xff0c;另一重要协议为TCP协议。两者对比&#xff1a;TCP协议复杂&#xff0c;但传输可靠。UDP协议简单&#xff0c;但传输不可靠。UDP协议全称为&#xff1a;User Datagram Protocol&#xff08;用户数据报协议&#xff09;。它是一个简…

嵌入式 STM32 使用C语言打开读取歌曲目录

目录 一、C语言目录库函数 1、打开一个目录文件opendir() 2、readdir&#xff08;);读取目录下文件 3、建立链表保存读到的文件名 一、C语言目录库函数 目录库函数链接&#xff1a;http://wjhsh.net/qiny1012-p-8405394.html 1、打开一个目录文件opendir() opendir()函数…

JavaScript BOM操作

目录 前言 window 对象 location 对象 navigator 对象 screen 对象 history 对象 前言 BOM&#xff08;Browser Object Model&#xff09;指的是浏览器对象模型&#xff0c;它是 JavaScript 和浏览器之间的接口。通过 BOM&#xff0c;JavaScript 可以与浏览器窗口交互&…

【Linux】重定向原理dup2缓冲区

文章目录重定向原理输出重定向关于FILE解释输出重定向原理追加重定向输入重定向dup2缓冲区语言级别的缓冲区内核缓冲区重定向原理 重定向的本质就是修改文件描述符下标对应的struct file*的内容 输出重定向 输出重定向就是把本来应该输出到显示器的数据重定向输出到另一个文…

自己制作投票链接网上投票链接制作可以投票的链接制作

近些年来&#xff0c;第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放&#xff0c;更多人选择微信投票小程序平台&#xff0c;因为它有非常大的优势。1.它比起微信公众号自带的投票系统、传统的H5投票系统有可以图…

RK3568平台开发系列讲解(设备驱动篇)Pinctrl子系统详解

🚀返回专栏总目录 文章目录 一、pinctrl子系统结构描述二、重要的概念三、主要的数据结构和接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我们知道在许多soc内部包含有多个pin控制器,通过pin控制器的寄存器,我们可以配置一个或者一组引脚的功能和特性。Linux…

K8S篇之pod及生命周期

文章目录Pod 概览pod使用方式Pod 中如何管理多个容器Pod 和控制器Pod 模板Pod 更新与替换静态 Pod容器探针pod的生命周期Pod 阶段容器状态容器重启策略Pod 状况pod readinessGates容器探针检查机制execgrpchttpGettcpSocket探测结果探测类型livenessProbe&#xff08;存活探针&…

【JDK8新特性之Lambda表达式-案例实操】

一.JDK8新特性之Lambda表达式-案例实操 之前我们学习了Stream流相关的内容&#xff0c;如果想看的同学可以看一下之前的文章&#xff0c;接下来我们就来学习和Lambda表达式有关的内容。 二.Lambda表达式案例实操 2.1 最原始创建线程案例版本 创建一个新的线程&#xff0c;指定…

[docker]Sealer简介

文章目录安装创建集群清理集群本机免密登录镜像构建与运行KubefileSealer ImageClusterfilesealer是阿里开源的一款分布式应用打包交付运行的解决方案&#xff1b;通过把分布式应用及其所依赖的数据库、中间件等一起打包成一个集群镜像&#xff0c;解决复杂应用的交付问题。安装…

阿里云服务器部署SpringBoot+Vue项目(宝塔面板傻瓜式操作)

准备工作 一台服务器(我用的是阿里云)SpringBoot项目的jar包Vue项目的dist包 一、购买服务器 然后重置实例密码。 远程连接 登陆成功后安装宝塔面板 二、安装宝塔面板(无账号的注册一个账号) 地址&#xff1a;https://www.bt.cn/new/download.html 选择对应的镜像、不知道…

简易项目:servlet实现个人博客(超级详细)

成品展示博客登录页2.博客预览页博客详情页4.博客编写发布页5.可访问网址http://43.143.248.172:8080/blog_system/login.html用户名:zhangsan密码:123确认需求1.1核心功能1.1.1用户登陆和注销这一部分需要满足用户的登入和注销操作&#xff0c;同时需要判断用户名和密码的正确…

【ArcGIS Pro二次开发】(8):图层(Layer)的基本操作

在ArcGIS中&#xff0c;图层(Layer)是地理数据的集合。可以在 ArcGIS Pro中将很多不同类型的数据表示为图层。 图层通常包含矢量&#xff08;要素&#xff09;或栅格数据。 图层的类型取决于您拥有的数据类型、其基础结构以及其他一些变量。 一、图层(Layer)的基本操作示例 以…

华为OD机试题,用 Java 解【矩阵最大值】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…