分类 Server 下的文章

系统环境介绍以及准备

查看系统版本

[root@xmg-hk ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

查看openssl版本

[root@xmg-hk ~]# openssl version 
OpenSSL 1.0.2k-fips  26 Jan 2017

官网下载openssl-1.1.1k

其他版本可参考下载: https://www.openssl.org/source/openssl-1.1.1k.tar.gz

cd /usr/local/
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar -zcvf openssl-1.1.1k.tar.gz

详细操作步骤

先备份

mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak

进入目录并编译

cd /usr/local/openssl-1.1.1k
./config --prefix=/usr/local/openssl
make && make install

建立链接

ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
echo “/usr/local/openssl/lib” >> /etc/ld.so.conf
ldconfig -v

查看是否升级成功

[root@xmg-hk ~]# openssl version 
OpenSSL 1.1.1k  25 Mar 2021
说明:需要先进行备份,备份需要在"建立链接"操作以前完成。

转自:https://cloud.tencent.com/developer/article/1907392

PHP扩展gmp被加载两次,报错如下:

PHP Warning: Module "gmp" is already loaded in Unknown on line 0

解决办法:

Not all PHP modules are loaded as separate modules and are part of the
PHP base binary. In this case the module is loaded without a separate
load statement/configuration. If in addition a separate configuration
file exists, e.g. /etc/php7/fpm/conf.d/gmp.ini, the web server tries
to load the module twice which can cause these kind of messages.
//打开.ini配置文件,将下面这行注销即可;
extension=gmp.so

原因:

是因为.ini文件底部又加载了一次,如下:

extension =  /www/server/php/80/lib/php/extensions/no-debug-non-zts-20200930/gmp.so

步骤一:

先检测本机是否有gmp扩展在mamp下,命令如下:

/Applications/MAMP/bin/php/php8.0.8/bin/php -i | grep gmp

如果没有此扩展,此时什么也不会出现,如果已经成功安装了扩展,将会出现如下所示的提示:

PWD => /Applications/MAMP/bin/php/php8.0.8/include/php/ext/gmp
$_SERVER['PWD'] =>
/Applications/MAMP/bin/php/php8.0.8/include/php/ext/gmp $_ENV['PWD']
=> /Applications/MAMP/bin/php/php8.0.8/include/php/ext/gmp

步骤二:

php官网下载其源码包php-8.0.8.tar.gz
https://www.php.net/releases/

注意:一定要与你的现在版本一致辞,必须,必须,必须!

可以下载到任意目录,下载完成以后,解压。找到目录.
111.png

步骤三:

将目录/Users/liziyu/Downloads/php-8.0.8/ext/,将gmp目录整拷贝到/Applications/MAMP/bin/php/php8.0.8/include/php/ext目录下,如图:
222.png

步骤四:

同时进入该目录下:

cd /Applications/MAMP/bin/php/php8.0.8/include/php/ext/gmp

执行命令:

/Applications/MAMP/bin/php/php8.0.8/bin/phpize

然后执行:

./configure --with-php-config=/Applications/MAMP/bin/php/php8.0.8/bin/php-config

再执行:

make

最后:

make install

3333.png

当出现如下图所示的提示时说明已经安装成功了。
此时重启php,然后执行

php -m 

成功的话会出现如下图的提示:
444.png

如果还没有此提示的话,则进入php的配置文件ini去修改,增加下面一行代码:

extension=gmp.so

再重启php查看。即可

本文参考:https://mycodde.blogspot.com/2020/01/install-php-gmp-extension-in-mamp-2020.html

1、第一步

$ which php
$ vim ~/.bash_profile

2、第二步

$ export PATH=/Applications/MAMP/bin/php/php7.2.7/bin:$PATH
$ #/Applications/MAMP/bin/php/php7.2.7/bin是我的php版本路径

3、第三步

$ source ~/.bash_profile

4、第四步

$ php -v

如果以上步骤仍然没有改变PHP的版本,再执行以下:

1、vim ~/.zshrc
2、source~/.bash_profile

<?php
echo date('Y-m-d H:i:s',strtotime('now'));//当前时间戳 2017-01-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1second'));//当前时间戳+1秒 2017-01-09 21:04:12
echo date('Y-m-d H:i:s',strtotime('+1minute'));//当前时间戳+1分 2017-01-09 21:05:11
echo date('Y-m-d H:i:s',strtotime('+1hour'));//当前时间戳+1小时 2017-01-09 22:04:11
echo date('Y-m-d H:i:s',strtotime('+1day'));//当前时间戳+1天 2017-01-10 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1week'));//当前时间戳+1周 2017-01-16 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1month'));//当前时间戳+1月 2017-02-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1year'));//当前时间戳+1年 2018-01-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+12year 12month 12day 12hour 12minute 12second'));//当前时间戳+12年,12月,12天,12小时,12分,12秒 2030-01-22 09:16:23
$t=1483967416;//指定时间戳
echo $dt=date('Y-m-d H:i:s',$t);//2017-01-09 21:10:16
/*方法一*/
echo date('Y-m-d H:i:s',$t+1*24*60*60);//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',$t+365*24*60*60);//指定时间戳+1年 2018-01-09 21:10:16
/*方法二*/
//$dt是指定时间戳格式化后的日期
echo date('Y-m-d H:i:s',strtotime("$dt+1day"));//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',strtotime("$dt+1year"));//指定时间戳+1年 2018-01-09 21:10:16
/*方法三*/
//$t是指定时间戳
echo date('Y-m-d H:i:s',strtotime("+1day",$t));//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',strtotime("+1year",$t));//指定时间戳+1年 2018-01-09 21:10:16
//指定时间戳加1月、1周、1小时、1分、1秒原理同上;

一、分析:

https://blog.csdn.net/weixin_44717746/article/details/106651480

二、总结:

  我们知道在没有面向对象编程语言的时候,我们都是用面向过程的方式来编写程序的,典型的就有C语言,Fortran等等,面向对象的思想,无疑带来了编程思维的一个新的飞跃,但因为多增加一层抽象,也面临着性能问题,典型的就是内存问题。

  面向对象编程,主要围绕着三大特性,封装,继承,多态来实现的,主要的实现方式多以基于类来实现。我们在实例化类的时候,一般会定义一个变量引用我们实例化的对象,引用,即代表着这个变量存放的不是这个实例化的对象,而是这个对象内存首地址,进而达到间接访问的目的。

  在这里,要谈到两个概念,栈和堆,栈一般来说,指的是cpu内部中的寄存器(Register)空间,而堆指的是电脑中的主存(Random Access Memory)。我们在定义一般变量的时候,变量会存放在栈中,而实例化的类会存放在堆中,因此我们要访问堆中的类时,我们要先在栈中提取该类的引用变量得到类的内存地址,进而访问到类中的数据,进行读,写操作。

  但其实一般来说,定义的变量和类的多少是人来决定的,机器的内存大小也就那样,因此,内存分配的工作主要由编译器(或者解释器)的算法来实现的,大概原理是把cpu的寄存器,缓存(cache),内存映射到虚拟内存列表上,再由算法分配最常使用的变量优先以快到慢的存储介质中存放,但类都是放在内存中的。

  现在2022年了,大部分的用户内存都处于16G,32G这个范围,而cpu的寄存器,就算比较牛逼最新的i7 8,9系cpu,也不过个位数的KB大小,cache可能还好一点,几MB到十几MB的大小已经是不错的了,速度大概是内存的5到10倍把,主要涉及到公式1/r+(1-r)h,其中h为Nc/Nc+Nm,Nc为cache存取的次数,Nm为内存存取次数,h为cache命中率,可以知道为了提高命中率,5到10是比较合理的。可想而知,栈内存的空间是如此地稀缺,因此合理地运用栈内存,是可以提高程序的速度的。

  所以,在写程序的时候,尽可能地把类相同的函数方法放入父类中,用继承的方式去引用这些公共的方法,把相同的变量放入连接属性中,或者父类中,减少内存中相同的拷贝,是可以节省不少内存的,同时合理编写算法,高效运用栈内存,尽可能地使用局部变量,在作用域结束的时候可以释放栈内存。

一、证书和编码

X.509证书,其核心是根据RFC 5280编码或数字签名的数字文档。
实际上,术语X.509证书通常指的是IETF的PKIX证书和X.509 v3证书标准的CRL 文件,即如RFC 5280(通常称为PKIX for Public Key Infrastructure(X.509))中规定的。

二、X509文件扩展

我们首先要了解的是每种类型的文件扩展名。 很多人不清楚DER,PEM,CRT和CER结尾的文件是什么,更有甚者错误地说是可以互换的。 在某些情况下,某些可以互换,最佳做法是识别证书的编码方式,然后正确标记。 正确标签的证书将更容易操纵

三、编码--决定扩展名方式

1).DER 扩展名

.DER = DER扩展用于二进制DER编码证书。

这些文件也可能承载CER或CRT扩展。 正确的说法是“我有一个DER编码的证书”不是“我有一个DER证书”。

2).PEM 扩展名

.PEM = PEM扩展用于不同类型的X.509v3文件,是以“ - BEGIN ...”前缀的ASCII(Base64)数据。

3)常见的扩展

3.1).CRT 扩展名

.CRT = CRT扩展用于证书。 证书可以被编码为二进制DER或ASCII PEM。 CER和CRT扩展几乎是同义词。 最常见的于Unix 或类Unix系统。

3.2).CER扩展名

CER = .crt的替代形式(Microsoft Convention)您可以在微软系统环境下将.crt转换为.cer(.both DER编码的.cer,或base64 [PEM]编码的.cer)。

可参考:https://support.comodo.com/index.php?/Knowledgebase/Article/View/361/17/how-do-i-convert-crt-file-into-the-microsoft-cer-format

.cer文件扩展名也被IE识别为 一个运行MS cryptoAPI命令的命令(特别是rundll32.exe cryptext.dll,CryptExtOpenCER),该命令显示用于导入和/或查看证书内容的对话框。

3.3).KEY 扩展名

.KEY = KEY扩展名用于公钥和私钥PKCS#8。 键可以被编码为二进制DER或ASCII PEM。

四、常见的OpenSSL证书操作

证书操作有四种基本类型。查看,转换,组合和提取。

1)查看证书

即使PEM编码的证书是ASCII,它们是不可读的。这里有一些命令可以让你以可读的形式输出证书的内容;

1.1)查看PEM编码证书

openssl x509 -in cert.pem -text -noout
openssl x509 -in cert.cer -text -noout
openssl x509 -in cert.crt -text -noout

如果您遇到这个错误,这意味着您正在尝试查看DER编码的证书,并需要使用“查看DER编码证书”中的命令。

unable to load certificate
12626:error:0906D06C:PEMroutines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: TRUSTEDCERTIFICATE

1.2)查看DER编码证书

openssl x509 -in certificate.der -inform der -text -noout

如果您遇到以下错误,则表示您尝试使用DER编码证书的命令查看PEM编码证书。在“查看PEM编码的证书”中使用命令

unable to load certificate
13978:error:0D0680A8:asn1 encodingroutines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1306:
13978:error:0D07803A:asn1 encodingroutines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509

2)转换证书格式

转换可以将一种类型的编码证书存入另一种。(即PEM到DER转换)
PEM到DER

openssl x509 -in cert.crt -outform der-out cert.der

DER到PEM

openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

3)组合证书

在某些情况下,将多个X.509基础设施组合到单个文件中是有利的。一个常见的例子是将私钥和公钥两者结合到相同的证书中。

组合密钥和链的最简单的方法是将每个文件转换为PEM编码的证书,然后将每个文件的内容简单地复制到一个新文件中。这适用于组合文件以在Apache中使用的应用程序。

4)证书提取

一些证书将以组合形式出现。 一个文件可以包含以下任何一个:证书,私钥,公钥,签名证书,证书颁发机构(CA)和/或权限链。

if (!in_array('sm4-cbc', openssl_get_cipher_methods())) {
    printf("不支持 sm4\n");
}

$key = 'her-cat.com';
$iv = random_bytes(openssl_cipher_iv_length('sm4-cbc'));

$plaintext = '她和她的猫';

$ciphertext = openssl_encrypt($plaintext, 'sm4-cbc', $key, OPENSSL_RAW_DATA , $iv);

printf("加密结果: %s\n", bin2hex($ciphertext));

$original_plaintext = openssl_decrypt($ciphertext, 'sm4-cbc', $key, OPENSSL_RAW_DATA , $iv);

printf("解密结果: %s\n", $original_plaintext);

结果如下:

加密结果: 45cd787b0a84603ae8fd443b81af4d17
解密结果: 她和她的猫


转载:https://her-cat.com/2021/08/23/php-openssl-sm4.html