OpenSSL命令行快速入门

在这里插入图片描述
OpenSSL是为网络通信提供安全及数据完整性的开放源代码软件库包,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议。本笔记介绍了OpenSSL命令行的摘要算法、密钥生成与管理、对称加密算法、非对称加密算法、密钥协商算法、签名验签算法等命令的使用方法。以SHA、RSA、AES、ECC、ECDSA、ECDH等为例进行介绍。

一、摘要算法

1. 详细使用手册
man openssl-dgst
2. 生成摘要

以SHA256为例。

openssl dgst -SHA256 -hex msg.txt

在这里插入图片描述

  • -SHA256 使用SHA256哈希算法,支持的摘要算法可以通过openssl list -digest-algorithms查看。
  • -hex为摘要输出默认选项,输出为编码后、可识别(UTF-8等)的十六进制摘要。

openssl dgst -SHA256 -out dgst.d msg.txt 

在这里插入图片描述

  • 摘要默认输出为编码后的十六进制文件。
  • -out <filename> 选项,指定摘要输出文件。

openssl dgst -SHA256 -binary -out dgst.d msg.txt

在这里插入图片描述

  • 若要后续进一步处理,应使用-binary选项输出二进制。

  • 使用hexdump工具查看二进制文件。可以发现二进制与之前生成的十六进制摘要一致。

3. 数字签名

生成签名

openssl dgst -sha256 -sign rsa.key -out signature.sign msg.txt 

在这里插入图片描述

  • -sign 指定用于生成签名的私钥,无需指定算法,工具从key中识别。
  • 签名默认输出为二进制数据。

验证签名:

openssl dgst -sha256 -verify rsa_pub.key -signature signature.sign msg.txt

在这里插入图片描述

  • -verify指定验签的公钥。
  • -signature指定签名文件。
  • 输出结果为:“Verified OK” 或 “Verification Failure”

二、对称加密算法

1. 详细使用手册
man openssl-enc
2. 加密

以AES为例

openssl enc -aes-128-cbc -e -a -p -pbkdf2 -in msg.txt -out chiper.enc

在这里插入图片描述

  • -aes-128-cbc指定加密算法,在man openssl-enc中列出支持的算法。
  • -e表示加密
  • -a指定加密后的数据进行base64编码,以方便传输。
  • -pbkdf2表示使用pbkdf2算法生成密钥,迭代次数由-iter指定,否则使用默认迭代次数。
  • -p表示加密后,输出实际使用的盐、密钥和偏移值到标准输出。

在执行加密时,会让输入password,并不是实际加密的密钥。实际加密的密钥是根据输入的password,利用kdf算法(如pbkdf2)生成的。实际密钥和偏移值可以使用-p选项,在加密后输出。

同时,也可以通过-K key指定实际使用的密钥。

在加密的时候会默认加入随机值盐salt,使得每次加密的生成密钥和加密值不一致,增加爆破难度。可以使用-nosalt选项不使用盐,通过-p可以发现,password一致时,每次生成的key都一样的。

同样的,也可以使用-S salt指定使用的盐而不使用随机值。

3. 解密
openssl enc -aes-128-cbc -d -a -p -pbkdf2 -in chiper.enc -out plain.d

在这里插入图片描述

  • -aes-128-cbc指定解密算法。
  • -e表示解密
  • -a指定先进行base64解码,再进行解密。
  • -pbkdf2表示加密时的密钥使用pbkdf2算法生成。
  • -p表示解密后,输出实际使用的盐、密钥和偏移值到标准输出。

三、密钥生成与处理

以RSA为例。

1. 详细使用手册
man openssl-genrsa	# RSA key generation
man openssl-genpkey	# common key generation for RSA, DSA, DH, EC and so on
man openssl-rsa		# RSA key processing
man openssl-pkey	# common key processing for RSA, DSA, DH, EC and so on
2. 生成密钥
openssl genrsa -out rsa.pem 1024

在这里插入图片描述

  • -out <filename> 输出的密钥文件。
  • 最后(1024)指明密钥的位数,不得小于512,默认2048。

此处生成的私钥处于明文状态,需对私钥文件进行加密:

openssl genrsa -aes128 -out rsa.pem 1024

在这里插入图片描述

  • -aes128 指定给密钥加密算法
3. 导出公钥
openssl rsa -in rsa.pem -pubout -out rsa_pub.pem

在这里插入图片描述

  • -in指定输入的私钥文件。
  • -pubout:默认输出为私钥,利用该选项指定输出为公钥。

Ps: -in -out 默认都是私钥,当输入或输出为公钥时,要分别加上-pubin、-pubout。若输入已经加上-pubin时,若输出也为公钥-pubout一般不用加,因为输入为公钥,输出默认也为公钥。

该原则适用于以下所有openssl rsa指令。

  • -out指定输出公钥文件。
4. 密钥格式转化

默认生成和输入输出都是pem格式,可以进行pem和der格式转化。

# pub key PEM to DER
openssl rsa -pubin -in rsa_pub.pem -outform DER -out rsa_pub.der

# priv key PEM to DER
openssl rsa -in rsa.pem -outform DER -out rsa.der

在这里插入图片描述

  • -outform 指定输出格式。
  • -pubin:默认输入为私钥,利用该选项指定输入为公钥。
5. 查看密钥参数
openssl rsa -in rsa.pem -text -noout

在这里插入图片描述

  • -text指明输出密钥的组件
  • -noout指明不输出编码的密钥

四、非对称密钥算法

以RSA为例。rsautl在3.0版本被废弃,用pkeyutl代替。

1. 详细使用手册
man openssl-pkeyutl	
man openssl-rsautl	# The command rsautl was deprecated in version 3.0. Use 'pkeyutl' instead.
2. 加密
# RSA enc
openssl pkeyutl -encrypt -in msg.txt -pubin -inkey rsa_pub.pem -out rsa_chiper.enc

# RSA enc padding oaep
openssl pkeyutl -encrypt -in msg.txt -pubin -inkey rsa_pub.pem -out rsa_chiper.enc -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
  • -encrypt 表示加密
  • -in 要加密的文件
  • -pubin:默认输入私有密钥,表示输入密钥为公钥
  • -inkey 指明加密的公钥文件
  • -out输出的加密文件
  • 可通过-pkeyopt rsa_padding_mode:oaep指明填充模式为oaep
  • 可通过-pkeyopt rsa_oaep_md:sha256指明oaep使用的摘要算法为SHA256
3. 解密
# RSA dec
openssl pkeyutl -decrypt -in rsa_chiper.enc -inkey rsa.pem -out rsa_plain.d


# RSA dec padding oaep
openssl pkeyutl -decrypt -in rsa_chiper.enc -inkey rsa.pem -out rsa_plain.d -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256

在这里插入图片描述

  • -decrypt 表示解密
  • -in 要解密的文件
  • -inkey 指明解密的私钥文件
  • -out输出的解密文件
  • 可通过-pkeyopt rsa_padding_mode:oaep指明填充模式为oaep
  • 可通过-pkeyopt rsa_oaep_md:sha256指明oaep使用的摘要算法为SHA256
4. 签名
openssl pkeyutl -sign -inkey rsa.pem -in hash.dgst -out signature.sign 

在这里插入图片描述

  • -sign 表示签名操作
  • -inkey 指明签名的私钥
  • -in 指明被签名的hash文件(二进制)
  • -out 指明签名文件
5. 验签
openssl pkeyutl -verify -pubin -inkey rsa_pub.pem -in hash.dgst -sigfile signature.sign 

在这里插入图片描述

  • -verify 表明验签操作
  • -pubin:默认输入私有密钥,表示输入密钥为公钥
  • -inkey 指明签名的公钥
  • -in 指明被签名的hash文件(二进制)
  • -sigfile 指明签名文件

指令校验-sigfile文件是否为-in的签名,直接输出验证结果。


openssl pkeyutl -verifyrecover -hexdump -pubin -inkey rsa_pub.pem -in signature.sign

or

openssl pkeyutl -verifyrecover -pubin -inkey rsa_pub.pem -in signature.sign | hexdump

在这里插入图片描述

  • -verify 表明验签操作
  • -pubin:默认输入私有密钥,表示输入密钥为公钥
  • -inkey 指明签名的公钥
  • -in 指明签名文件
  • -hexdump 显示输出的二进制文件,也可以不使用该选项,管道传输至hexdump解析。

该指令将-in文件恢复,对比可见输出数据和签名前的数据hash.dgst一致。

五、 通用公钥算法指令(ECC为例)

1. 详细使用手册
# common
man openssl-genkey
man openssl-pkey
man openssl-pkeyparam
man openssl-pkeyutl	

# EC
man openssl-ec
man openssl-ecparam

pkey、pkeyparam分别是ec和ecparam的通用版本,支持其他公钥算法的密钥和参数处理,而ec和ecparam只支持ec的相关操作。

2. 生成参数

查看支持的椭圆曲线

openssl ecparam -list_curves

在这里插入图片描述

  • -list_curves 列出支持的椭圆曲线。

选择曲线生成参数

openssl genpkey -genparam -algorithm EC -out ec_param.pem -pkeyopt ec_paramgen_curve:secp256k1 -pkeyopt ec_param_enc:named_curve

or

openssl ecparam -out ec_param_exp.pem -name secp256k1 -param_enc explicit

genpkey

  • -genparam指明生成参数
  • -algorithm指明公钥算法,参数生成支持DH, DSA和EC
  • -out指明输出的参数文件
  • -pkeyopt ec_paramgen_curve:secp256k1指定曲线为P-256
  • -pkeyopt ec_param_enc:指定参数的编码方式,named_curve 通过曲线名字(OID)编码,explicit通过显式的参数(a, b, G, p, n, h)编码(下节text可见区别)

ecparam

  • -out指明输出的参数文件
  • -name指定参数的编码方式,named_curve 通过曲线名字(OID)编码,explicit通过显式的参数(a, b, G, p, n, h)编码(下节text可见区别)

显示曲线参数

openssl ecparam -in ec_param.pem -text
openssl ecparam -in ec_param_exp.pem -text

在这里插入图片描述

  • -text 显示参数
  • -in指定输入参数文件
3. 生成密钥

从参数生成密钥

openssl genpkey -paramfile ec_param.pem -out eckey.pem
  • -paramfile 指定输入的参数文件
  • -out 指定输出的密钥文件

直接生成密钥

openssl genpkey -algorithm EC -out eckey.pem -pkeyopt ec_paramgen_curve:secp256k1 -pkeyopt ec_param_enc:named_curve

or

openssl ecparam -out ec_key.pem -name secp256k1 -genkey

genpkey

  • -genparam指明生成参数
  • -algorithm指明公钥算法,密钥生成支持RSA, RSA-PSS, EC, X25519, X448, ED25519和ED448
  • -out指明输出的密钥文件
  • -pkeyopt ec_paramgen_curve:secp256k1指定曲线为P-256
  • -pkeyopt ec_param_enc:指定参数的编码方式,named_curve 通过曲线名字(OID)编码,explicit通过显式的参数编码

ecparam

  • -out指明输出的密钥文件
  • -name指定参数的编码方式,named_curve 通过曲线名字(OID)编码,explicit通过显式的参数编码
4. 密钥处理

对于EC算法,ec和pkey都可实现以下操作,下以ec为例,pkey可直接替换

输出公钥

openssl ec -in ec_key.pem -pubout -out ec_key_pub.pem
  • -in指定输入的私钥文件。

  • -pubout指定输出为公钥。

  • -out指定输出公钥文件。


私钥文件加密

openssl ec -in ec_key.pem -aes128 -out ec_key.pem
  • -in指定输入的私钥文件。

  • -aes128指定加密算法为aes128。

  • -out指定输出加密私钥文件。


显示密钥参数

openssl ec -in ec_key.pem -text

在这里插入图片描述

6. 签名验签ECDSA
# signature
openssl pkeyutl -sign -inkey ec_key.pem -in hash.dgst -out signature.sign 
Enter pass phrase for ec_key.pem:

# verify
openssl pkeyutl -verify -pubin -inkey ec_key_pub.pem -in hash.dgst -sigfile signature.sign 
Signature Verified Successfully
  • 指令与RSA一致。
7. 密钥协商ECDH
openssl pkeyutl -derive -inkey ec_keyA.pem -peerkey ec_key_pubB.pem -out secretA
openssl pkeyutl -derive -inkey ec_keyB.pem -peerkey ec_key_pubA.pem -out secretB

在这里插入图片描述

  • -derive 表示进行共享密钥导出
  • -inkey 指明己方私钥
  • -peerkey 指明对方公钥
  • -out 输出共享密钥

Ps: 学习笔记分享交流,如有错误欢迎指出。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 基于QT开发的轻量级HTTP、HTTPS服务器源码+项目说明.zip 底层有QTcpSocket、QSslSocket两个版本,分别对应HTTP和HTTPS。 #### 用到的Qt库有: * core * network * concurrent * testlib(测试用,运行不需要) * OpenSSL(如果需要HTTPS) 不依赖外部库,理论上可以部署到任何Qt支持的平台上。 推荐使用Linux系统或者Unix系统,因为在5.7后,Qt更换了Unix相关系统的底层模型,从select更换为了poll,这样改进后,并发就脱离了1024个的限制。 使用本库,推荐 Qt5.8.0 或者更高版本,以及支持 C++11 的编译器(例如VS2013或者更高),对操作系统无要求。 ## 性能介绍 本库性能一般,符合一般项目使用标准 原因是Qt底层是poll,库中又有一些跨线程操作 在我的电脑( MacBookPro 16" & i9 CPU & macOS 10.15.7 )使用siege进行测试,命令行参数如下:
PHP 手册 Mehdi Achour Friedhelm Betz Antony Dovgal Nuno Lopes Hannes Magnusson Georg Richter Damien Seguy Jakub Vrana 其他贡献者 2007-12-10 Philip Olson 中文翻译人员: 王远之 肖理达 肖盛文 黄啸宇 宋琪 陈伯乐 刘铭 © 1997-2007 PHP 文档组 版权信息 前言 入门指引 简介 简明教程 安装与配置 安装前需要考虑的事项 Unix 系统下的安装 Mac OS X 系统下的安装 Windows 系统下的安装 PECL 扩展库安装 还有问题? 运行时配置 语言参考 基本语法 类型 变量 常量 表达式 运算符 控制结构 函数 类与对象(PHP 4) 类与对象(PHP 5) Namespaces 异常处理 引用的解释 安全 简介 总则 以 CGI 模式安装时 以 Apache 模块安装时 文件系统安全 数据库安全 错误报告 使用 Register Globals 用户提交的数据 魔术引号 隐藏 PHP 保持更新 特点 用 PHP 进行 HTTP 认证 Cookie 会话 处理 XForms 文件上传处理 使用远程文件 连接处理 数据库永久连接 安全模式 PHP 的命令行模式 函数参考 .NET — .NET 函数 Apache — Apache 特有函数 APC — APC 可选 PHP 缓存 APD — APD 高级 PHP 调试器 Arrays — Array 数组函数 Aspell — Aspell 函数(已废弃) BBCode — BBCode Functions BC math — BC math 高精度数学函数 bcompiler — BCompiler PHP 字节码编译器 Bzip2 — Bzip2 压缩函数 Calendar — Calendar 日历函数 CCVS — CCVS API 函数(已废弃) Classes/Objects — Classes/Objects 类/对象函数 Classkit — Classkit 函数 ClibPDF — ClibPDF Functions [deprecated] COM — COM 和 .Net(Windows)函数 Crack — Crack Functions ctype — Character Type Functions CURL — CURL, Client URL Library Functions Cybercash — Cybercash Payment Functions CyberMUT — Credit Mutuel CyberMUT functions Cyrus IMAP — Cyrus IMAP administration Functions Date/Time — Date/Time 日期/时间函数 DB++ — DB++ Functions dba — Database (dbm-style) Abstraction Layer Functions dBase — dBase Functions DBM — DBM Functions [deprecated] dbx — dbx Functions Direct IO — Direct IO Functions Directories — Directory 目录函数 DOM — DOM Functions DOM XML — DOM XML Functions enchant — enchant Functions Errors and Logging — Error Handling and Logging Functions Exif — Exif Functions Expect — Expect Functions fam — File Alteration Monitor Functions FDF — Forms Data Format Functions Fileinfo — Fileinfo Functions filePro — filePro Functions Filesystem — Filesystem 文件系统函数 Filter — Filter Functions Firebird/InterBase — Firebird/InterBase Functions Firebird/Interbase (PDO) — Firebird/Interbase Functions (PDO_FIREBIRD) FriBiDi — FriBiDi Functions FrontBase — FrontBase Functions FTP — FTP 函数 Function handling — Function Handling Functions GeoIP — GeoIP Functions gettext — Gettext Functions GMP — GMP Functions gnupg — gnupg 函数 gopher — Net_Gopher haru — Haru PDF Functions hash — hash Functions HTTP — HTTP 函数 Hyperwave — Hyperwave Functions Hyperwave API — Hyperwave API Functions i18n — i18n 函数 IBM (PDO) — IBM Functions (PDO_IBM) ibm_db2 — IBM DB2, Cloudscape and Apache Derby Functions iconv — iconv Functions id3 — ID3 Functions IIS Functions — IIS Administration Functions Image — Image 图像函数 Imagick Image Library IMAP — IMAP, POP3 and NNTP Functions Informix — Informix Functions Informix (PDO) — Informix Functions (PDO_INFORMIX) Ingres II — Ingres II Functions IRC Gateway — IRC Gateway Functions Java — PHP / Java Integration JSON — JSON 函数 kadm5 — KADM5 LDAP — LDAP Functions libxml — libxml Functions Lotus Notes — Lotus Notes Functions LZF — LZF Functions Mail — Mail 邮件函数 Mailparse — Mailparse Functions Math — Math 数学函数 MaxDB — MaxDB PHP Extension MCAL — MCAL Functions mcrypt — Mcrypt Encryption Functions MCVE — MCVE (Monetra) Payment Functions Memcache — Memcache Functions mhash — Mhash Functions Mimetype — Mimetype Functions Ming (flash) — Ming functions for Flash Misc. — Miscellaneous Functions mnoGoSearch — mnoGoSearch Functions MS SQL Server — Microsoft SQL Server Functions MS SQL Server (PDO) — Microsoft SQL Server and Sybase Functions (PDO_DBLIB) Msession — Mohawk Software Session Handler Functions mSQL — mSQL Functions Multibyte String — Multibyte String Functions muscat — muscat Functions MySQL — MySQL 函数 MySQL (PDO) — MySQL Functions (PDO_MYSQL) mysqli — MySQLi 扩展库 Ncurses — Ncurses Terminal Screen Control Functions Network — Network Functions Newt — Newt Functions NSAPI — NSAPI-specific Functions Object Aggregation — Object Aggregation/Composition Functions Object overloading — Object property and method call overloading OCI8 — Oracle 函数 ODBC — ODBC Functions (Unified) ODBC and DB2 (PDO) — ODBC and DB2 Functions (PDO_ODBC) OGG/Vorbis — oggvorbis openal — OpenAL Audio Bindings OpenSSLOpenSSL Functions Oracle — Oracle 函数(已废弃) Oracle (PDO) — Oracle Functions (PDO_OCI) Output Control — Output Control 输出控制函数 OvrimosSQL — Ovrimos SQL Functions Paradox — Paradox File Access Parsekit — Parsekit Functions PCNTL — Process Control Functions PCRE — Perl 兼容正则表达式函数 PDF — PDF 函数 PDO — PDO Functions phar — Phar archive stream and classes PHP Options/Info — PHP Options&Information POSIX — POSIX Functions POSIX Regex — POSIX 扩展正则表达式函数 PostgreSQL — PostgreSQL 数据库函数 PostgreSQL (PDO) — PostgreSQL Functions (PDO_PGSQL) Printer — Printer Functions Program Execution — Program Execution Functions PS — PostScript document creation Pspell — Pspell Functions qtdom — qtdom Functions radius — Radius Rar — Rar Functions Readline — GNU Readline Recode — GNU Recode Functions RPMReader — RPM Header Reading 函数 runkit — runkit Functions SAM — SAM - Simple Asynchronous Messaging Satellite — Satellite CORBA client extension [deprecated] SCA — SCA Functions SDO — SDO Functions SDO DAS XML — SDO XML Data Access Service Functions SDO-DAS-Relational — SDO Relational Data Access Service Functions Semaphore — Semaphore, Shared Memory and IPC Functions SESAM — SESAM Database Functions Session PgSQL — PostgreSQL Session Save Handler Sessions — Session 会话处理函数 shmop — Shared Memory Functions SimpleXML — SimpleXML functions SNMP — SNMP 函数 SOAP — SOAP Functions Sockets — Socket Functions SPL — Standard PHP Library (SPL) Functions SQLite — SQLite Functions SQLite (PDO) — SQLite Functions (PDO_SQLITE) ssh2 — Secure Shell2 Functions Statistics — Statistics Functions Streams — Stream Functions Strings — String 字符串处理函数 SVN — Subversion 函数 SWF — Shockwave Flash Functions swish — Swish Functions Sybase — Sybase Functions TCP Wrappers — TCP Wrappers Functions tidy — Tidy Functions Tokenizer — Tokenizer Functions Unicode — Unicode Functions URLs — URL 函数 Variables — Variable 变量函数 Verisign Payflow Pro — Verisign Payflow Pro Functions vpopmail — vpopmail Functions W32api — W32api 函数 WDDX — WDDX Functions win32ps — win32ps Functions win32service — win32service Functions xattr — xattr Functions xdiff — xdiff Functions XML — XML 语法解析函数 XML-RPC — XML-RPC 函数 XMLReader — XMLReader functions XMLWriter — XMLWriter Functions XSL — XSL functions XSLT — XSLT Functions YAZ — YAZ Functions YP/NIS — YP/NIS Functions Zip — Zip File Functions Zlib — Zlib Compression Functions PHP at the Core: A Hacker's Guide to the Zend Engine The PHP 5 build system Extension structure Memory management Working with variables Writing functions Working with classes and objects Working with resources Working with INI settings Working with streams PDO Driver How-To Extension FAQs Zend Engine 2 API reference Zend Engine 1 The future: PHP 6 and Zend Engine 3 FAQ — FAQ:常见问题 一般信息 邮件列表 获取 PHP 数据库问题 安装 — 安装常见问题 编译问题 使用 PHP PHP 和 HTML PHP 和 COM PHP 和其它语言 从 PHP/FI 2 移植到 PHP 3 从 PHP 3 移植到 PHP 4 从 PHP 4 移植到 PHP 5 杂类问题 附录 PHP 及其相关工程的历史 Migrating from PHP 5.1.x to PHP 5.2.x Migrating from PHP 5.0.x to PHP 5.1.x 从 PHP 4 移植到 PHP 5 从 PHP 3 移植到 PHP 4 从 PHP/FI 2 移植到 PHP 3 PHP 的调试 配置选项 php.ini 配置选项 所支持时区列表 扩展库分类 函数别名列表 保留字列表 资源类型列表 支持的协议/封装协议列表 可用过滤器列表 所支持的套接字传输器(Socket Transports)列表 PHP 类型比较表 解析器代号列表 Userland Naming Guide 关于本手册 开放出版许可协议 函数索引 补充说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值