qianfeng

qianfeng 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

qianfeng 赞了问题 · 3月6日

解决PHP网站不用COOKIE如何实现一周内自动登录,谢谢

PHP网站不用COOKIE如何实现一周内自动登录,谢谢!

关注 2 回答 12

qianfeng 赞了文章 · 2019-06-12

永强教你加解密:对称篇(一)

大家好,我是永强,就是老李之前经常给你们说的区块链大神、大学肄业却依然大公司iOS主程一波儿流、只生活在老李口中尚未真实露面的骗钱高手、老王的左膀右臂 ——— 赵永强。我和尼古拉斯赵四之间并没有什么强关联,我只是单方面认识他而已。

之前老李企图让我发表一些关于如何进行高端骗工资骗钱的教程,被我义正言辞地拒绝了:

                   毕竟是毕生绝学,不能就这么轻而易举地教给你们

不过后面有时间我可以给大家出一些关于“如何在公司混日子还能升职加薪”的入门级教程,传男不传女,独家绝技!敬请期待!

图片描述

言归正传,那个一直以来我对加解密技术都是耿耿于怀的,因为很多年前有一次面试中被这东西给坑掉了,虽然我后来就自己对加解密中一些自己不懂的地方请教了对方而且他也没有给我讲清楚…

事情都过去好几年了,本人自我感觉已经一定程度掌握了一些关于加密的高端技术,因为决定出来装一波儿逼,时间比较紧张,我打算赶在2020年农历新年之前把逼装完,你们要注意配合。

我知道老李之前在社区发表了一些关于加密啊、解密啊之类的东西,甚至还扯上了什么DH什么ECDH,又是质数又是椭圆曲线,不过这并不与本系列产生冲突,这并不重要,不要在意这些细节,他那个too young too simple,sometimes naive…

这将是一个大概由四篇左右的文章组成的系列文章,所以在正式开始之前,我不得不强调一点 ——— 如下这几门学科的基础理论知识:

  • 《离散数学》
  • 《微分与积分》
  • 《空间几何》
  • 《概率论》

你并不需要具备。。。

不过你总得知道除了html和css之外的任意一门编程语言。尽管本人精通上到CLanguage下到Perl之类的各种语言,但是本文将采用世界上最好的语言进行一些程序演示,后面老李可能会使用CLanguage和Golang进行其他语言的演示补充。

简单说来呢,加解密技术就是分为两大类:

  • 对称加解密
  • 非对称加解密

其中,常见的对称加解密算法有DES、3DES、AES;而非对称加解密技术比较典型的则是RSA,就是什么公钥私钥证书什么乱七八糟的。

我们先从对称加解密开始,粗暴地说呢,对称加解密就是“加密和解密的时候用同一个密码”,听起来就非常对称,有没有?

用图表达一下就是:

图片描述

最一开始的时候,我朝人民一般都是倾向于使用“天王盖地虎”,“宝塔镇河妖”这种加解密技术;然而,美帝用了一种叫做DES的技术进行对称加解密,这玩意一度成为业界通用的对称加解密技术,银行、五角大楼都爱用这玩意,可惜好景不长、世风日下、世态炎凉,这玩意的破解成本越来越低越来越低~~ 于是,为了续命,就又有一些白胡子老头给DES打补丁,缝缝补补搞出来一个玩意叫做3DES,继续用,又不是不能用…这个顾名思义就行了,别打我,真的:3DES就是用DES处理(注意是处理,我没说是加密)了三次的意思。就目前看来,3DES实际上用的可能也并不是十分广泛了,所以如果大家在选择对称加解密技术的时候,尽量避开DES和3DES就可以了。

呵呵,喜新厌旧的沙雕人类…虽然DES已经没人用了,但毕竟也是辉煌过,我觉得还是得动手表演一波儿。我们知道,在php7里,原来的mcrypt系列加解密已经被放弃掉了,官方建议我们使用openssl系列来进行加解密,所以确保你的PHP环境里安装了openssl标准扩展。

<?php
// 这个函数打印出来openssl支持的所有加密方法以及模式的组合
$arr_ava_methods = openssl_get_cipher_methods();
print_r( $arr_ava_methods );

文件保存成test.php后,执行一把:php test.php | grep des,结果你们感受一下:

图片描述

其中带有ede的,比如des-ede*这样的就表示是3DES。还有这么多奇奇怪怪的后缀是什么含义?回头再说…又不是不能用。

图片描述

筛选一下,我们看des(非des3)有几种带着尾巴的具体方法:

  • des-cbc
  • des-cfb*(注意后面的通配符星号)
  • des-ecb
  • des-ofb

我们先用传统des方法继续进行装逼表演:

<?php
// 我们就选用des-ecb方法进行一次des加密
$ava_methods = openssl_get_cipher_methods();
$my_method   = 'des-ecb';
if ( !in_array( $my_method, $ava_methods ) ) {
  exit( '错误的加密方法'.PHP_EOL );
}
$key  = "123456";
$data = "helloMOTO";
echo "明文:".$data.PHP_EOL;
$enc_data  = openssl_encrypt( $data, $my_method, $key );
echo "密文:".$enc_data.PHP_EOL;
$dec_data  = openssl_decrypt( $enc_data, $my_method, $key );
echo "明文:".$dec_data.PHP_EOL;

保存为test.php执行一把:

图片描述

完美!就像老王的meshbox一样,完美!

简单解析一下:

换个方法继续一下:我们使用openssl_get_cipher_methods()函数获取到可以使用的所有des加密方法,然后简单判断一下我们选用的方法是否在其中;紧接着我们用123456作为密码,helloMOTO作为明文内容,openssl_encrypt()就是加密函数,openssl_decrypt()就是解密函数,具体的函数原型出门左拐查手册,总之一切都是这么的完美!

<?php
// 我们就选用des-ecb方法进行一次des加密
$ava_methods = openssl_get_cipher_methods();
$my_method   = 'des-cbc';
if ( !in_array( $my_method, $ava_methods ) ) {
  exit( '错误的加密方法'.PHP_EOL );
}
$key  = "123456";
$data = "helloMOTO";
echo "明文:".$data.PHP_EOL;
$enc_data  = openssl_encrypt( $data, $my_method, $key );
echo "密文:".$enc_data.PHP_EOL;
$dec_data  = openssl_decrypt( $enc_data, $my_method, $key );
echo "明文:".$dec_data.PHP_EOL;

执行一波儿,结果如下图:

图片描述

并不完美,报错了,一个warning级的错误,虽然并不影响加密和解密,但是毕竟是报错了,错误原文我复制粘贴过来,你们感受下:

PHP Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended in /home/ubuntu/lab/test.php on line 10

大概意思就是:用了一个并不推荐而且不安全的空iv在test.php的第十行。我正在翻译的这句的时候,已经精通英语的老李在旁边跟我说“你这翻译也太硬了,要学会人性化,看好了,一看你这就是没上过全日制大学本科的恶果”:

PHP警告:openssl_encrypt():iv向量最好别是空的,不推荐这么用,而且这样并不安全~

什么是iv向量?先抛开这个问题,我先写一段代码,让他能跑起来:

<?php
$ava_methods = openssl_get_cipher_methods();
$my_method   = 'des-cbc';
if ( !in_array( $my_method, $ava_methods ) ) {
  exit( '错误的加密方法'.PHP_EOL );
}
// 处理iv向量的两行代码
$iv_length = openssl_cipher_iv_length( $my_method );
$iv        = openssl_random_pseudo_bytes( $iv_length );
$key  = "123456";
$data = "helloMOTO";
echo "明文:".$data.PHP_EOL;
$enc_data  = openssl_encrypt( $data, $my_method, $key, 0, $iv );
echo "密文:".$enc_data.PHP_EOL;
$dec_data  = openssl_decrypt( $enc_data, $my_method, $key, 0, $iv );
echo "明文:".$dec_data.PHP_EOL;

注意到8、9、10和15、17两行,均为iv向量做了改动,然后这次代码保存了运行一波儿:

图片描述

完美!就像老王的meshbox一样,完美!

那么,在des加解密中,我们遗留了两个问题:

  • des-cbcdes-cfb等这些后缀是什么意思?
  • iv向量是什么鬼东西?

长按或许有惊喜

图片描述

查看原文

赞 24 收藏 13 评论 3

qianfeng 发布了文章 · 2015-07-02

mac 手动 清理 磁盘 释放空间

先看下那个目录占用比较多

sudo du -sh /*

发现 /Applications/usr 目录 和 /cores 目录占用 比较异常。

卸载不用的 iMovieiPhoto 等,删除一些应用的无用文件,如SourceTree目录下会有它各个旧版本的目录,QQ聊天记录的图片(好几G)。

清理QQ聊天记录内的图片目录(可以用QQ清理也可以自己找到目录清理):

/Users/Qianfeng/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/xxxxxxxx/Image

xxx 是QQ号码

停止TimeMachine本地备份(这个看你个人喜欢):

sudo tmutil disablelocal

一层层目录查看发现 /usr/local/Cellar/ 目录占用挺大,这个是brew安装的包得目录,看下装过什么,然后卸载掉不用的(我卸载了 android相关的):

brew list 
brew uninstall xxxxx

搜索了下 /cores 这个占了十几G的目录,发现好像是进程出错时的dump目录(不明觉厉感),进目录查看修改时间,4月份,距今3个月了应该没用,删光。

回来了20+G左右的空间,还有一些应用程序的缓存文件可以用 cleanMyMac 2 或者 腾讯电脑管家 MAC版 清理。

查看原文

赞 0 收藏 3 评论 0

qianfeng 赞了文章 · 2015-05-26

简单快速的 PHP 词库工具

这么说吧,假如你有一段文本,还有一个巨大的关键词库(几十万起步),现在需要从文本中找出这些关键词,甚至要基于关键词对应的值做一些替换,怎么弄?

在这个简单又常见的需求面前,strtr str_replace preg_replace 什么的集体歇菜了,因为词库太大。

scws?一开始我也这么弄的,可惜它只能帮你把词库中的词找出来,不能基于关键词对应的值进行处理。虽然可以利用词库的属性字段,但它只支持两个字节,显然不能满足需求。

在 Google 上找了半天也没找到我需要的轮子,只好自己撸了一个词库工具:SimpleDict

  1. 简单。纯 PHP 实现,不用安装扩展,也不依赖 xcache memcache redis 之类的缓存。
  2. 实用。支持大词库,我自己 40W 的词库跑起来轻轻松松。还支持回调式替换哦!
  3. 快速。使用了高大上的 trie 树进行匹配,查找耗时跟文本长度相关,跟词库大小关系不大,速度杠杠的。词典保存成二进制文件,使用时只维持一个文件句柄,避免了传统 trie 树内存开销巨大的弊端。

欢迎有需要的朋友试用 :P

查看原文

赞 5 收藏 13 评论 10

qianfeng 赞了回答 · 2015-05-06

Go到目前还没有解决成为守护进程(Daemonize)的问题吧?各位是怎么解决的?

go 程序里面因为使用了线程,不能够简单的通过 fork 来实现子进程,否则会出现各种错乱。我记得官方文档里面有提到这个事情的,不过一时找不到链接了。

我自己也是使用 supervisord 来管理 go 进程的。如果需要 go 进程之间通信,推荐使用 socket file 来跨进程通信,不要直接共享 fd,并不方便。

另外,并不是说 go 程序完全做不到共享 fd,我以前曾在 go 里实现过一个安全的通过 fork/exec 跨进程共享 fd 的小框架。代码没有开源,无法直接贴出,抱歉。

我的实现里有两个关键点:

  • 父进程一定要在 fork 之后立即 exec,这样才能保证 go 不会出现莫名奇妙的错误。详见 os package 的 StartProcess() 实现。
  • 通过 fork/exec 创建的子进程是可以共享父进程所有 fd 的,但问题是如何告诉子进程它是子进程,而且怎么和父进程通信。我的做法是通过约定好的特殊环境变量来传递信息,为了信息不被伪造,这里面还做了一些加密。一旦确定父子关系和用来做通信的 fd(通常是一个 pipe),剩下的事情就水到渠成了。

关注 13 回答 4

qianfeng 回答了问题 · 2015-02-03

解决读PHP框架源码,从哪入手

从 index.php

关注 20 回答 9

qianfeng 回答了问题 · 2014-09-12

解决如何让服务器完全支持 UTF-8 编码?

mysql : set names utf8

php:
header Content-Type:text/html;charset=UTF-8
开发编码用UTF8

apache 不需要配置

关注 0 回答 2

qianfeng 回答了问题 · 2014-09-12

解决PHP网站不用COOKIE如何实现一周内自动登录,谢谢

不可能~~~~

关注 2 回答 12

认证与成就

  • 获得 15 次点赞
  • 获得 20 枚徽章 获得 1 枚金徽章, 获得 6 枚银徽章, 获得 13 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2011-10-19
个人主页被 454 人浏览