在 PHP 中实现与 OpenSSL 兼容的 ‌AES 加密(含 Salted__ 头)‌,需手动处理盐值生成和密钥派生。以下是完整实现代码及分步说明:

一、加密实现代码

<?php
/**
 * AES 加密(兼容 OpenSSL 的 "Salted__" 格式)
 * @param string $data 明文数据
 * @param string $password 加密密码
 * @param string $method 加密算法,如 'AES-256-CBC'
 * @return string Base64 编码的加密数据(含 Salted__ 头)
 */
function opensslEncryptWithSalt($data, $password, $method = 'AES-256-CBC') {
    // 生成 8 字节随机盐
    $salt = openssl_random_pseudo_bytes(8);
    
    // 通过盐和密码派生密钥与 IV
    $keyIv = deriveKeyAndIV($password, $salt, $method);
    $key = $keyIv['key'];
    $iv = $keyIv['iv'];
    
    // 加密数据
    $encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
    
    // 拼接 Salted__ 头 + 盐 + 密文
    $result = "Salted__" . $salt . $encrypted;
    
    // Base64 编码便于传输
    return base64_encode($result);
}

/**
 * 派生密钥和 IV(模拟 OpenSSL 的 EVP_BytesToKey)
 */
function deriveKeyAndIV($password, $salt, $method) {
    $digest = 'md5'; // OpenSSL 默认使用 MD5
    $keySize = 32;   // AES-256 需要 32 字节密钥
    $ivSize = 16;    // CBC 模式需要 16 字节 IV
    
    $derived = '';
    $data = '';
    $length = 0;
    
    while ($length < $keySize + $ivSize) {
        $data = $data . $password . $salt;
        $md5 = hash($digest, $data, true);
        $data = $md5;
        $derived .= $md5;
        $length += strlen($md5);
    }
    
    return [
        'key' => substr($derived, 0, $keySize),
        'iv'  => substr($derived, $keySize, $ivSize)
    ];
}

二、解密实现代码

<?php
/**
 * AES 解密(兼容 OpenSSL 的 "Salted__" 格式)
 * @param string $encryptedData Base64 编码的加密数据
 * @param string $password 解密密码
 * @param string $method 加密算法,如 'AES-256-CBC'
 * @return string 解密后的明文
 */
function opensslDecryptWithSalt($encryptedData, $password, $method = 'AES-256-CBC') {
    // 解码 Base64
    $data = base64_decode($encryptedData);
    
    // 提取盐(前 8 字节,跳过 "Salted__" 头)
    $salt = substr($data, 8, 8);
    
    // 提取密文(去除头部的 16 字节:Salted__ + 盐)
    $encrypted = substr($data, 16);
    
    // 派生密钥和 IV
    $keyIv = deriveKeyAndIV($password, $salt, $method);
    $key = $keyIv['key'];
    $iv = $keyIv['iv'];
    
    // 解密数据
    return openssl_decrypt($encrypted, $method, $key, OPENSSL_RAW_DATA, $iv);
}

三、使用示例

<?php
// 加密示例
$plaintext = "Hello, World!";
$password = "mySecretPassword";
$encrypted = opensslEncryptWithSalt($plaintext, $password);
echo "加密结果: " . $encrypted . "\n";

// 解密示例
$decrypted = opensslDecryptWithSalt($encrypted, $password);
echo "解密结果: " . $decrypted . "\n";

四、核心逻辑说明

‌1. 盐值生成‌

- 阅读剩余部分 -

很多时候,我们需要在sql里面直接解析json字符串。这里针对mysql5.7版本的分水岭进行区分。

1.对于mysql5.7以上版本

使用mysql的内置函数JSON_EXTRACT(column, '$.key'),这个函数有两个参数,第一个参数column代表json列的列名;第二个参数key代表json字符串中的某一个key。

SELECT JSON_EXTRACT('{"priceTag":"员工/合作关键人","priceDiscount":"90"}', '$.priceDiscount') AS '定价折扣';

对于简单的json字符串肯定是可以解析成功,但是对于嵌套数组的没试过。

2.对于mysql5.7以下版本

只能充分发挥已有函数的功能去截取实现,无论实现方式是存储过程还是简单的sql语句,其原理都是一样的。

第一步,将所有的花括号的闭括号'}'替换成英文逗号',';第二步,获取key的坐标keyIndex和长度keyLength;第三步,获取以key为起点,第一个英文逗号','的坐标symbolIndex;第四步,使用substring截取字符串SUBSTRING(targetJsonStr, keyIndex + keyLength, symbolIndex - keyIndex - keyLength);第五步,使用replace将双引号'"'替换成空字符串'',完工。

示例:从{"priceTag": "员工/合作关键人","priceDiscount": "90"}中获取priceDiscount的值。

SELECT REPLACE
(
    SUBSTRING(
        REPLACE('{"priceTag":"员工/合作关键人","priceDiscount":"90"}','}',','),
        LOCATE('priceDiscount":',REPLACE('{"priceTag":"员工/合作关键人","priceDiscount":"90"}','}',','))
            + CHAR_LENGTH('priceDiscount":'),
        LOCATE(
            ',',
            REPLACE('{"priceTag":"员工/合作关键人","priceDiscount":"90"}','}',','),
            LOCATE('priceDiscount":',REPLACE('{"priceTag":"员工/合作关键人","priceDiscount":"90"}','}',','))
                + CHAR_LENGTH('priceDiscount":')
        ) - (
            LOCATE('priceDiscount":',REPLACE('{"priceTag":"员工/合作关键人","priceDiscount":"90"}','}',','))
                + CHAR_LENGTH('priceDiscount":')
        )
    ),'"',''
) AS '定价折扣';

刚刚接触Linux没多久,觉得现在的linux还真好用多了。昨天想弄一下samba,翻看了一下论坛的帖子,发现都是讲怎么改配置文件的,原先我在HP-UX上装samba都是用swat配置的。觉得用图形化的配置工具比较方便,特别是对新手来说。废话不多说,把我昨天搞定samba的经验各位和我一样的新手交流一下。

1.安装samba

sudo apt-get install samba
sudo apt-get install smbfs

2.安装swat

sudo apt-get install swat

3.这一步比较重要,安装xinetd

sudo apt-get install xinetd

4.安装后执行

sudo vi /etc/inetd.conf

这一行前面如果有#off# 的话就删除掉#off#

#off# swat stream tcp nowait.400 root /usr/sbin/tcpd /usr/sbin/swat

然后执行

sudo vi /etc/xinetd.d/swat

打开文件后把一下内容贴进去

# description: SAMBA SWAT
service swat
{
disable = no
socket_type = stream
protocol = tcp
#should use a more limited user here
user = root
wait = no
server = /usr/sbin/swat
}

- 阅读剩余部分 -

1、CentOS使用yum update更新时不升级内核

cp /etc/yum.conf    /etc/yum.conf.bak

2、修改yum的配置文件

vi /etc/yum.conf

在[main]的最后添加

exclude=kernel*  
exclude=centos-release*
说明:不要采用低版本中常用的如下方式:yum –exclude=kernel* update
这个命令在Fedora中基本可以用,但是对于 centos-release 的包无法处理。

本文主要介绍如何将SMB文件系统挂载至Linux上并执行读写操作。

前提条件

注意 Linux系统推荐挂载使用NFS文件系统。由于Linux系统对SMB协议的兼容程度较低,建议仅在需要跨操作系统共享数据的情况下使用Linux系统挂载SMB文件系统。

SMB文件系统现在官方支持如下的Linux操作系统版本。如果没有特别声明,本文仅针对以下Linux操作系统版本:

  • CentOS 7.6 64bit(3.10.0-957.5.1.el7.x86_64)
  • Ubuntu 18.04 64bit(4.15.0-48-generic)
  • Debian 9.9 64bit(4.9.0-9-amd64)
  • Suse Enterprise Server 12 SP2 64bit(4.4.74-92.35-default)
  • OpenSUSE 42.3 64bit(4.4.90-28-default)
  • Alibaba Cloud Linux(4.19.34-11.al7.x86_64)
  • CoreOS(4.19.43-coreos VersionID=2079.4.0)
说明 由于Linux一些早期版本的SMB客户端在某些场景有缺陷,如果您使用了非官方支持的Linux操作系统版本,阿里云不能保证该SMB文件系统的可靠性。

安装软件

在Linux操作系统中安装cifs-utils工具包。

如果您使用Ubuntu或Debian操作系统,通过apt-get软件包管理工具进行安装。

sudo apt-get update
sudo apt-get install cifs-utils

如果您使用RHEL、CentOS、Alibaba Cloud Linux操作系统,通过yum包管理器进行安装。

sudo yum install cifs-utils

如果您使用OpenSUSE、SLES12-SP2操作系统,通过zypper或yast工具进行安装。

sudo zypper install cifs-utils
sudo yast2 -> Software -> Software Management, 然后安装cifs-utils

挂载文件系统

使用root用户或sudo enabled客户端管理员用户,登录Linux。

执行以下命令,挂载文件系统。

mount -t cifs //hostname/myshare /mnt -o vers=2.0,guest,uid=0,gid=0,dir_mode=0755,file_mode=0755,mfsymlinks,cache=strict,rsize=1048576,wsize=1048576

挂载命令格式:mount -t cifs //<挂载点>/myshare <挂载目录> -o <挂载选项>

- 阅读剩余部分 -

树莓派挂了块3.5的硬盘做下载机和局域网影音共享,性能和耗电量都好于群晖Nas,特别是多盘位做raid保护的机型,群晖就不用24小时开机了,有需要的时候可以直接用树莓派通过网卡唤醒。

换了电视后对片源的质量有了更高的要求,文件超过20G后,即使使用wifi6路由器,电视网卡支持800m+的传输速率,smb已经满足不了需求了,播放杜比视界版本的文件ftp也很卡,目前三个共享协议都尝试过了,分享一下搭建的过程。

smb

应该是兼容性最好的协议了,通吃各种系统,很多移动端的播放器也都支持

好习惯,先更新软件源

sudo apt-get update

安装samba

sudo apt-get install samba
sudo apt-get install samba-common-bin

配置samba

sudo vim /etc/samba/smb.conf

global节点下添加一下配置,优化传输速度

min receivefile size = 16384
write cache size = 262144

- 阅读剩余部分 -

微软在Windows 11中加入了不少新功能,例如“小组件”。小组件的按钮默认固定在任务栏当中,点击即可呼出小组件的面板,用户可以自定义设置小组件乃至添加增删小组件。

Win11系统小组件

微软这个设计,试图让用户更加重视Windows 11系统中支持小组件这一特性。动态磁贴退出了历史舞台,微软或许是试图让小组件接管动态磁贴的信息展示功能,让用户无需开启App,就可以通过小组件来直观了解信息。

然而,小组件的实际体验却难尽人意,一来小组件会影响系统性能,不少朋友都反馈小组件面板太卡顿;二来Windows 11仍处于起步阶段,小组件的数量偏少,只有天气、体育、照片、新闻等聊聊几种,没什么可玩性;三来小组件和系统集成度低,点开小组件会跳转到网页而非系统App。如此一来,关闭鸡肋的小组件,就成为了很多人的诉求。今天,就来简单介绍一下吧。

隐藏小组件图标

实际上,人们对Windows 11小组件的不爽,主要来源于它占据了任务栏的宝贵位置。Windows 11默认将小组件图标放置在多任务视图按钮旁边,这个鸡肋的功能在目前阶段显然不值得放在如此醒目的位置上。

要隐藏Windows 11小组件图标,其实非常简单。开启设置面板,进入到“个性化”-“任务栏”,即可在其中站到任务栏项的开关,将“小组件”关闭即可。

卸载Windows 11小组件

隐藏了小组件图标,没法解决所有问题,例如资源占用。小组件在后台还会持续占用资源,如果你的确完全用不上它,那可以把它卸载掉。

卸载Windows 11小组件,我们需要用到CMD。使用管理员权限打开Windows Terminal终端的“命令提示符”,或者使用管理员权限运行CMD,输入以下命令。

winget uninstall MicrosoftWindows.Client.WebExperience_cw5n1h2txyewy

按下回车键,Windows 11小组件就会被卸载掉了。

如果你想要重新安装Windows 11小组件,则可以执行以下命令。

winget install 9MSSGKG348SP

总结

总的来说,Windows 11小组件有些许赶鸭子上架的意思。实际上,微软并非没有在系统中尝试内置小组件机制,例如Windows Vista和Win7都支持小组件,但人们始终没有给小组件找到在Windows系统中的精准定位。目前Windows 11的小组件无论是功能还是种类,都过于鸡肋,希望日后它们能和应用程序有机结合,带来更好的体验吧。

RMP 是 LINUX 下的一种软件的可执行程序,你只要安装它就可以了。这种软件安装包通常是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后缀是.rpm。
RPM是Red Hat公司随Redhat Linux推出了一个软件包管理器,通过它能够更加轻松容易地实现软件的安装。

常用命令

1.安装软件:执行rpm -ivh rpm包名,如:

#rpm -ivh apache-1.3.6.i386.rpm

2.升级软件:执行rpm -Uvh rpm包名

3.反安装:执行rpm -e rpm包名

4.查询软件包的详细信息:执行rpm -qpi rpm包名

5.查询某个文件是属于那个rpm包的:执行rpm -qf rpm包名

6.查该软件包会向系统里面写入哪些文件:执行rpm -qpl rpm包名

扩展资料:

RPM包的安装,RPM软件包的一个例子:

foo-1.0-1.i386.rpm

其中包括软件包的名称(foo),版本号(1.0),发行号(1),和硬件平台(i386)。

- 阅读剩余部分 -

进程 CPU 使用排序,CPU属于第三列,使用sort来排序

sudo ps aux|sort -k3 -r|head -10

进程 内存 使用排序,内存属于第四列,使用sort来排序

sudo ps aux|sort -k4 -r|head -10

主要是通过ps aux来显示所有的进程

sort 命令

使用哪一列排序,使用 ASCII码的大小排序,例如9.0 会排在 25.0的前面,因为9比2大

-k --key=KEYDEF sort via a key; KEYDEF gives location and type

反序排列

-r --reverse reverse the result of comparisons