• 最新文章
  • linux
  • php
  • sql
  • 服务端
  • tool
  • cocos

PHP openssl_decrypt 加密解密,js的CryptoJS数据加密解密

一、php方面 1.需要开启openssl扩展 2.注:php 的 mcrypt_ 函数簇在 7.1.0 版本中开始 deprecated,并在 7.2.0 版本中彻底废弃。其实在 2015 就已经开始建议大家使用 openssl_encrypt/openssl_decrypt 来代替 mcrypt_encrypt/mcrypt_decrypt,缓冲了 N 久,这一天终于在 7.2.0 版本上到来了。 openssl_decrypt 的 OPENSSL_ZERO_PADDING默认会补零到16位 aes-128-cbc: 表示16位的 method 长度的问题,密码学方式我们用的最多的有两种,AES-128-CBC 与 AES-256-CBC 字符串的长度问题 1 bit 位 = 1 二进制数据 1 byte 字节 = 8 bit 1 字母 = 1 byte = 8 bit 128位/8=16字节=16字符 192位/8=24字节=24字符 256位/8=32字节=32字符 也就是说KEY 的长度是根据AES-128-CBC 与 AES-256-CBC 变换的。使用 AES-128-CBC 时,key的长度应该为16位,使用 AES-256-CBC时,key的长度应该为32位。 <?php // 需要加密的字符串 $plaintext = "hello"; // 加密密钥(必须是16、24或32个字符长,对应AES-128、AES-192、AES-256) $key = "examplekey123456"; // 请确保密钥的安全性 // 初始化向量(IV),必须是16个字符长 $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-128-cbc')); // 加密字符串 $encrypted = openssl_encrypt($plaintext, 'aes-128-cbc', $key, 0, $iv); // 如果需要,可以将IV和密文一起存储或传输(通常使用base64编码以便于存储和传输) $encrypted_with_iv = base64_encode($iv.$encrypted); echo "加密后的字符串(包含IV): " . $encrypted_with_iv . ""; // 将加密字符串(包含IV)解码为原始二进制数据 $decoded = base64_decode($encrypted_with_iv); // 提取IV(前16个字符)和密文(剩余部分) $iv = substr($decoded, 0, 16); $encrypted = substr($decoded, 16); // 解密字符串 $decrypted = openssl_decrypt($encrypted, 'aes-128-cbc', $key, 0, $iv); echo "解密后的字符串: " . $decrypted; ?> 二、js方面 cryptojs:下载地址 https://code.google.com/archive/p/crypto-js/downloads cryptojs:文档说明 CryptoJS - CryptoJS cryptojs:在线调试工具 在线加密解密 <!-- 加密js--> <script src="__STATIC__/common/js/crypto/rollups/aes.js"></script> <script src="__STATIC__/common/js/crypto/components/pad-zeropadding.js"></script> /** * 加密 */ function doEncrypt(data) { if (data == '' || data == undefined) { return data; } let key = CryptoJS.enc.Latin1.parse('F79JF2tNdHLW4bid'); let iv = CryptoJS.enc.Latin1.parse('bk4h1mv84RCOdyn2'); //加密 return CryptoJS.AES.encrypt(data, key, {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding}); } 转自:https://blog.csdn.net/qq_25275355/article/details/116918996

AWS 在EC2上创建root用户,并使用root用户登录

最近有项目需要使用AWS的EC2服务器; 在创建服务器实例之后发现,没有root用户,仔细阅读AWS EC2文档,发现默认是ec2-user用户; 那我们需要创建一个root用户 1.创建 root 用户 注意:必须要要在ec2-user用户下执行 sudo passwd root 之后会提示你输入两次密码: Changing password for user root. New password: Retype new password: 输入完成之后我们的root用户就创建成功了; 我们尝试登录用户 su root 输入密码 Password: # 可以正常登录; AWS EC2默认情况下,密码身份验证和根用户登录是被禁用的;AWS EC2 管理 Linux 实例的用户账户 2.开启密码登录 同时也告诉我们,如果有需要,可以自己开启密码登录; vim /etc/ssh/sshd_config 将 PasswordAuthentication no 配置的 no 改为 yes,支持其他用户密码登录 如果需要 root 用户密码登录 将 PermitRootLogin 配置改为yes 重启 sshd 可以用下面命令。也可以用 systemctl restart sshd.service ; sudo /sbin/service sshd restart 3.设置其他用户密码 在 root 用户下可以设置其他用户密码 passwd 用户名 输入密码 New password: Retype new password: 这样就可以正常密码登录了;不过还是建议使用密钥登录;密码可以设置,在sudo的时候使用。

centos7 安装用yum命令安装wget无法安装

centos7 安装用yum命令安装wget无法安装 lijunlin 2019.03.10 15:56:56 字数 113 阅读 8,859 在终端执行yum -y install wget时,终端提示: 已加载插件:fastestmirror Loading mirror speeds from cached hostfile There are no enabled repos. Run “yum repolist all” to see the repos you have. To enable Red Hat Subscription Management repositories: 解决方法:在终端运行curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

go操作aws s3

v2 官方推荐版本,需要go版本>=1.20 安装 go get github.com/aws/aws-sdk-go-v2 go get github.com/aws/aws-sdk-go-v2/config go get github.com/aws/aws-sdk-go-v2/service/s3 必要参数 bucket: 存储桶的名称 Region: 存储桶所在区域,例us-east-1 accessKeyID: 访问存储桶所需的KeyID secretAccessKey: 访问存储桶所需的AccessKey 如何获取accessKeyID和secretAccessKey:指南 var ( s3Client *s3.Client bucket = "yourbucketname" ) func InitS3Client() { accessKeyID := "xxxxx" secretAccessKey := "xxxxx" cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("ap-east-1"), config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accessKeyID, secretAccessKey, "")), ) if err != nil { log.Fatalf("unable to load SDK config, %v", err) } s3Client = s3.NewFromConfig(cfg) } func UploadToS3(filePath, fileName, mimeType string) (string, error) { file, err := os.Open(filePath) if err != nil { return "", fmt.Errorf("failed to open file %q, %v", filePath, err) } defer file.Close() _, err = s3Client.PutObject(context.TODO(), &s3.PutObjectInput{ Bucket: aws.String(bucket), Key: aws.String(fileName), Body: file, ContentType: aws.String(mimeType), }) if err != nil { return "", fmt.Errorf("failed to upload file to S3, %v", err) } return fmt.Sprintf("https://%s.s3.amazonaws.com/%s", bucket, fileName), nil } 参考2 // 创建s3Client实例。 payKeyId := "AK***" paySecret := "oiy***" accessKeyID := payKeyId secretAccessKey := paySecret cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("ap-east-1"), config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accessKeyID, secretAccessKey, "")), ) if err != nil { fmt.Printf("unable to load SDK config, %v", err) } name := "test" s3Client := s3.NewFromConfig(cfg) filePath := "static/test.jpg" // 读取本地文件。 fd, err := os.Open(filePath) if err != nil { return } defer fd.Close() _, err = s3Client.PutObject(context.TODO(), &s3.PutObjectInput{ Bucket: aws.String("up"), Key:

免费flux 文本转图像生成器,无限次数

免费flux 文本转图像生成器 Free AI FLUX Image Generator是一款免费flux.1文本转图像生成器,用于文本到图像的生成。利用Flux的模型,它创建高质量、创意十足的图像,以增强您的工作流程,而且无限次数。 Free AI FLUX Image Generator使用流程 1登录(或注册) 2输入英文提示词,注意,一定是英文提示词。 3等待(我们按照队列处理请求,请求量大时,可能较长时间,所以需要教程时间,您可关闭网页,后续可以在我的 FLUX 中找到您的任务) 价格:完全免费,且不限制生成次数 官网地址:https://aiflux.cc/zh

mysql如何查询近一天/一周/一个月的数据

//今天 select * from 表名 where to_days(时间字段名) = to_days(now()); //昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 //近7天 SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名) //近30天 SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名) //本月 SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' ) //上一月 SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1 //查询本季度数据 select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(now()); //查询上季度数据 select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(DATE_SUB(now(),interval 1 QUARTER)); //查询本年数据 select * from `ht_invoice_information` where YEAR(create_date)=YEAR(NOW()); //查询上年数据 select * from `ht_invoice_information` where year(create_date)=year(date_sub(now(),interval 1 year)); //查询当前这周的数据 SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now()); //查询上周的数据 SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now())-1; //查询上个月的数据 select name,submittime from enterprise where date_format(submittime,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m') select * from user where DATE_FORMAT(pudate,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m') ; select * from user where WEEKOFYEAR(FROM_UNIXTIME(pudate,'%y-%m-%d')) = WEEKOFYEAR(now()) select * from user where MONTH(FROM_UNIXTIME(pudate,'%y-%m-%d')) = MONTH(now()) select * from user where YEAR(FROM_UNIXTIME(pudate,'%y-%m-%d')) = YEAR(now()) and MONTH(FROM_UNIXTIME(pudate,'%y-%m-%d')) = MONTH(now()) select * from user where pudate between 上月最后一天 and 下月第一天 //查询当前月份的数据 select name,submittime from enterprise where date_format(submittime,'%Y-%m')=date_format(now(),'%Y-%m')

各种时间操作(PHP)

一、获取时间 1、获取本周一 date('Y-m-d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)); //w为星期几的数字形式,这里0为周日 2、获取本周日 date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600)); //同样使用w,以现在与周日相关天数算 3、获取上周一 date('Y-m-d', strtotime('-1 monday', time())); //无论今天几号,-1 monday为上一个有效周未 4、获取上周日 date('Y-m-d', strtotime('-1 sunday', time())); //上一个有效周日,同样适用于其它星期 5、获取本月一日 date('Y-m-d', strtotime(date('Y-m', time()) . '-01 00:00:00')); //直接以strtotime生成 6、获取本月最后一日 date('Y-m-d', strtotime(date('Y-m', time()) . '-' . date('t', time()) . ' 00:00:00')); //t为当月天数,28至31天 7、获取上月一日 date('Y-m-d', strtotime('-1 month', strtotime(date('Y-m', time()) . '-01 00:00:00'))); //本月一日直接strtotime上减一个月 8、获取上月最后一日 date('Y-m-d', strtotime(date('Y-m', time()) . '-01 00:00:00') - 86400); //本月一日减一天即是上月最后一日 9、获取当前时间前6天 date('Y-m-d', strtotime('-6 days')); 10、指定时间加一个月 date("Y-m-d",strtotime("+1 month",strtotime("2012-02-04"))); 11、指定时间加一周 date("Y-m-d",strtotime("+1 week",strtotime("2011-02-04"))); 12、指定时间加一天 date("Y-m-d",strtotime("+1 day",strtotime("2011-02-04"))); 13、当前时间加一天 date('Y-m-d H:i:s',strtotime('+1 day')); 14、当前时间加一小时 date('Y-m-d H:i:s',strtotime('+1 hour')); 15、当前时间加一分钟 date('Y-m-d H:i:s',strtotime('+1 minute')); 16、当前时间加一月 date('Y-m-d H:i:s',strtotime('+1 mouth')); 17、获取当前月的第一天和最后一天 $date = date('Y-m-d'); function getMonth($date){ $firstday = date("Y-m-01",strtotime($date)); $lastday = date("Y-m-d",strtotime("$firstday +1 month -1 day")); return array($firstday,$lastday); } 18、获取上月的第一天和最后一天 $date = date('Y-m-d'); function getlastMonthDays($date){ $timestamp=strtotime($date); $firstday=date('Y-m-01',strtotime(date('Y',$timestamp).'-'.(date('m',$timestamp)-1).'-01')); $lastday=date('Y-m-d',strtotime("$firstday +1 month -1 day")); return array($firstday,$lastday); } 19、获取下月的第一天和最后一天 $date = date('Y-m-d'); function getNextMonthDays($date){ $timestamp=strtotime($date); $arr=getdate($timestamp); if($arr == 12){ $year=$arr +1; $month=$arr -11; $firstday=$year.'-0'.$month.'-01'; $lastday=date('Y-m-d',strtotime("$firstday +1 month -1 day")); }else{ $firstday=date('Y-m-01',strtotime(date('Y',$timestamp).'-'.(date('m',$timestamp)+1).'-01')); $lastday=date('Y-m-d',strtotime("$firstday +1 month -1 day")); } return array($firstday,$lastday); } 二、计算指定时间和当前时间相差年月日时分秒 date_default_timezone_set('PRC');//声明时区 $enddate="2018-6-14 17:29:10"; $date=floor((strtotime($enddate)-strtotime(date('Y-m-d H:i:s')))/86400); echo "相差天数:".$date."天<br/><br/>"; $hour=floor((strtotime($enddate)-strtotime(date('Y-m-d H:i:s')))%86400/3600); echo "相差小时数:".$hour."小时<br/><br/>"; $minute=floor((strtotime($enddate)-strtotime(date('Y-m-d

宝塔面板创建FTP帐号连接失败的解决方法 服务器发回了不可路由的地址。使用服务器地址代替

在宝塔面板中创建了FTP帐号后,使用FileZilla、CuteFtp等FTP软件无法连接,出现类似“服务器回应不可路由的地址。使用服务器地址代替。”,或者 “错误: 读取目录列表失败” 的错误信息,可以参考本文的解决方法,来排查处理。 【1】排查宝塔面板中的FTP服务是否启动 在宝塔面板的【软件商店】切换至 【已安装】软件列表,找到其中的 Pure-FTPd,点开右侧对应的 设置 项,检查该服务器软件的FTP服务器软件的当前状态是否为 开启 状态。 【2】检查服务器(防火墙)端口设置 服务器(防火墙)端口是否放行,配置是否正确,直接关系到FTP是否可以连接至服务器的重要因素。 首先,在宝塔面板的【安全】中的 系统防火墙,检查是否添加了21端口(FTP协议默认端口),如果使用 sftp,则还需要添加22端口; 另外,FTP被动模式端口范围(39000-40000)是否添加,如下图所示: 如果使用的是腾讯云 \ 阿里云的云服务器,还需要检查对应服务器端的安全组中的端口是否也进行了相应的放行设置。 【3】检查FTP用户名和密码 确保您使用正确的 FTP用户名 和 密码 进行连接。可以在宝塔面板的 FTP 管理页面查看当前FTP账户的用户名和密码,并确保输入的信息无误。 【4】检查被动模式(PASV)设置 FTP服务器默认处于主动模式,但有时FTP客户端可能需要切换为被动模式。在您的FTP客户端中,找到被动模式(PASV)设置选项,并确保其已启用。 在 FileZilla 的 站点管理器 中切换至 传输设置,把里面的 传输模式 设置为 被动。 其实,使用FTP软件连接服务器出现类似“服务器回应不可路由的地址。使用服务器地址代替。”,或者 “错误: 读取目录列表失败” 的错误信息,主要就是端口是否放行,建议主要排查宝塔面板和服务器端防火墙的端口设置。

golang jwt 签署令牌Authentication token

1.要安装 jwt 包,首先需要 安装Go,然后可以使用下面的命令将其添加jwt-go为 Go 程序中的依赖项。 go get -u github.com/golang-jwt/jwt/v5 2.将其导入到您的代码中: import "github.com/golang-jwt/jwt/v5" 3.demo func Test(t *testing.T) { //商户 subject := "01H" // 密钥 secretBase64 := "AwFj+OTCI=" secret, err := base64.StdEncoding.DecodeString(secretBase64) if err != nil { log.Fatalf("Error decoding base64 secret: %v", err) } // 过期秒数 expirseIn := 60 * time.Second // 创建jwt token token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "sub": subject, "exp": time.Now().Add(expirseIn).Unix(), }) // 使用密钥签名 tokenString, err := token.SignedString(secret) if err != nil { log.Fatalf("Error signing token: %v", err) } fmt.Println("tokenString=", tokenString) m := make(mapinterface m = "www" m = "qqq" // 将数据转为JSON格式 jsonData, err := json.Marshal(m) if err != nil { log.Fatalf("Error marshalling JSON: %v", err) } client := &http.Client{} url := "https://demo.com" method := "POST" req, err := http.NewRequest(method, url, bytes.NewBuffer(jsonData)) if err != nil { log.Fatalf("Error creating request: %v", err) } req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", tokenString)) req.Header.Set("Content-Type", "application/json; charset=utf-8") resp, err := client.Do(req) if err != nil { log.Fatalf("Error sending request: %v", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatalf("Error reading response body: %v", err) } log.Printf("Response body: %s", string(body)) } log.Printf("Response StatusCode: %d,%d", resp.StatusCode,http.StatusOK) info := TestRespone{} err = ffjson.Unmarshal(body, &info) if err != nil { log.Printf("body