Pulpcode

捕获,搅碎,拼接,吞咽

0%

情景

也许是你某次了解了一些关于数字签名的知识,想要系统的学习一下。或者是你的某个项目让你不得不找一种技术方案,你找到了数字签名,然后打算继续学着看看怎么用。

资料

首先你会读到类似的资料(来源于网络):

“发送报文时,发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方,接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签名进行解密,如果这两个摘要相同、那么接收方就能确认该数字签名是发送方的。

数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字摘要的值也将发生变化。不同的文件将得到不同的数字摘要。 一次数字签名涉及到一个哈希函数、发送者的公钥、发送者的私钥。

阅读全文 »

安装路径

linux目录结构

linux默认的目录结构是这样的:

普通执行程序文件 /usr/bin

服务器执行程序文件和管理程序文件 /usr/sbin

应用程序配置文件 /etc

日志文件 /var/log

应用程序文档文件 /usr/share/doc

应用程序手册页文件 /usr/share/man

/usr/local/lib 和 /usr/lib的区别

usr的并不是user的意思,而是unix system resrouces,这一点有助于理解/usr这个子文件系统。

阅读全文 »

ASCII字符转义

每次说到转义字符,首先想到的就是ASCII码。

转义字符就是一种代表,我们要区分展示和其本身在内存,在硬盘中的存储的区别。

比如这两个:

\a 响铃(BEL) 007

\b 退格(BS) 008

也就是说我们在字符串中输入的’\a’就是代表了一个字符,那么假如说我就是想要’\a’这两个字符呢?

这时候就要用到反转义了:’\a’ 就代表 ‘\a’(两个字符)

阅读全文 »

其实一开始我们去学习加密解密知识的时候,往往先入为主,认为加密解密就是对数据在一端加密,传输后再到另一端去解密。
类似于“国王的秘密文件用类似凯撒密码这样的东西加密后给某个人”这样的剧情。

具体的加密手段还是要和具体的需求场景相联系起来。不过这背后的原因到底是因为加密是一个很泛的概念,还是因为以下讨论的部分技术本身就不算是加密。

摘要(指纹)

摘要算法就是我们常说的hash(哈希)算法,hash算法的特征是:

  1. 对于两个不同的数据,不会生成相同的指纹。(唯一性)
  2. 对于一个指纹,并不能逆推出它的原始数据。(不可逆性)

比较常见的hash算法就是md5和sha1了。

真实场景:

如果是密码之类的存储,仅仅hash是不够的,因为会有类似于彩虹表这样的东西来暴力破解,这时我们就需要原始数据中加入一些“料”,来加大逆推的难度。

阅读全文 »

今天同事一下子删除了n条数据库的内容,原因是where语句的部分是这样的:

where tran_no = 0;

但是tran_no 是一个varchar类型的,为什么varchar的类型会导致这条where语句成功?

先看结论:

当比较数字和varchar时,mysql会把varchar转换为数字,首字符为数字0的,或者其他字符的都会转换为0。

所以varchar类型字段=0 只能排除首字符为非零数字的字符串

所以,除了像’2two’这样的字符,大多数字符都被where“抓”到了。

这对于那些在动态语言中(比如php),null,””, 0 各种乱写乱用的人而言,简直就是噩梦。

任务描述:

需要将python的json字符串存到数据库中,还要保证读取出来后,能解析成字典,中间不会发生任何转义或者改变。

而对于pickle生成的序列化对象,操作过程是一样的。

使用到的python库有 json, MySQLdb

要点1:

我们要保证,存储格式json的类型是BLOB类型的

1
`json` blob NOT NULL  COMMENT 'json',
阅读全文 »

很长一段时间,我一直就纠结,什么时候应该使用if处理错误,什么时候应该使用try catch处理错误,甚至是很少有人用到的Assert,我知道大多数程序员仅仅是乱用而已。

区分

首先我们要理解,if,assert,try分别擅长处理那些错误。类似写文章一样,不要一“好”到底,一“很”到底,要学会用语言去表达一种思想。

不会终止程序逻辑运行的归类为错误,会终止程序逻辑运行的归类为异常。

因为错误不会终止逻辑运行,所以错误是逻辑的一部分。而异常就是那些不应该出现在业务逻辑中的东西。

首先要理解if本身是用来处理逻辑跳转的,其本身并不能做什么有关错误处理的事情。就一个函数而言,也就是在逻辑判断的时候返回一个值,或者直接return。而这只能算逻辑处理的一部分,最多你可以将其区分为正确的逻辑和错误的逻辑。

所以我觉得如果你写出这样的代码,绝对不是一个好做法:

1
2
3
4
if(a == null){
prinf("程序出现错误!")
return
}
阅读全文 »