[TOC]

0X00 密码发展史

描述:密码是一种用来混淆的技术,它希望将正常的(可识别的)信息转变为无法识别的信息。当然,对一小部分人来说,这种无法识别的信息是可以再加工并恢复的。密码在中文里是“口令”(password)的通称。登录网站、电子邮箱和银行取款时输入的“密码”其实严格来讲应该仅被称作“口令”,因为它不是本来意义上的“加密代码”,但是也可以称为秘密的号码。主要限定于个别人理解(如一则电文)的符号系统,如密码电报、密码式打字机。

说白了密码源自于人与人之间不信任,大家都想保护自己的私有财产,所以各种加密算法被创造了出来。

  • 第一代密码:早期在设计软件或网站的时候,数据库存中存放用户名和密码大致是这样的
    WeiyiGeek.第一代密码
    可以看到,用户名和密码都是明文的形式存储在数据库中。这种设计思路非常简单,但其安全问题也一下子暴漏出来了。一旦数据库被“脱裤”或者用户网络被攻击,用户名和密码便会立刻泄漏。


  • 第二代密码:

    • 为了规避第一代密码设计的缺陷,这次程序猿们在数据库中不直接保存明文密码,而是存储加密之后的密码,MD5 就是其中最典型的加密算法。

    • MD5 是一种单向散列函数,单向散列函数的作用是将任何长度的一段数据散列成固定长度,常用于生成消息认证码等等,可以与非对称算法一起用于数字签名。

    • MD5 因为其不可逆的特性,所以程序猿们常常用来对数据库中的密码进行加密。这样做的好处是,如果数据库不幸遭遇脱裤事件(其实现在国内大型的网站几乎没有不落马的,被脱裤很正常),那么就算泄漏出来的也不是明文的密码,危害不至于那么大。
      WeiyiGeek.第二代密码
      你脑补着黑客拿到这串数据时一脸茫然的样子,但道高一尺魔高一丈,随着计算机运算能力的提升以及硬盘成本的降低,人们想到了将所有常见的单词组合的 MD5 结果建立数据库以供查询(这种我们称之为彩虹表破解)。
      WeiyiGeek.MD5
      因此,只要你将密码设置的复杂一点,第二代密码也是没那么容易被破解的:


  • 第三代密码
    • 可我们的网站或程序总不能要求用户一定要使用超复杂的密码组合,那么如何确保数据库丢失后密码的安全性呢?换言之,就是如何将用户简单的密码变得更复杂一些?
      • 加点盐是一个不错的解决方案!
    • 盐(Salt),在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。
    • 实现“加盐”的操作也并不复杂,只要我们在进行 MD5 计算前随机地为用户的密码加上一串字符即可。比如先将用户的原始密码计算一次 MD5 值,取中间 16 位加在原始密码后边,再计算一次 MD5 的值就是“加盐”的效果啦。
      WeiyiGeek.
      最后,世界上并不存在最锋利的矛和最坚硬的盾;只有不断提高破解的成本,直到黑客觉得“不值当”的时候,就是相对的安全!

0x01 常规算法

1.Hash 算法

Q:什么是 Hash?(自维基百科)
答:散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小的数字“指纹”的方法。
散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。
该函数将数据打乱混合,重新创建一个叫做散列值的指纹。
散列值通常用来代表一个短的随机字母和数字组成的字符串;
好的散列函数在输入域中很少出现散列冲突,在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。

世界上没有两片完全相同的树叶,也没有两个相同的指纹,散列函数是用于从数据中创建小的数字指纹的方法。


0x02 常见加密

单向加密

描述:单向加密只能加密,不能解密,常用于提取数据的指纹信息以此来验证数据的完整性
但是单向加密会引发雪崩效应:雪崩效应就是一种不稳定的平衡状态也是加密算法的一种特征,它指明文或密钥的少量变化会引起密文的很大变化,就像雪崩前山上看上去很平静,但是只要有一点问题,就会造成一片大崩溃。
可以用在很多场合对于Hash码,雪崩效应是指少量消息位的变化会引起信息摘要的许多位变化。

单向加密中使用的主要Encrpty有
常用的加密工具: md5sum、sha1sum/sha256/sha512sum、openssl dgst;


单向加密中使用的主要算法有
加密算法:md5(标准密钥长度128位)、sha1(标准密钥长度160位)、md4(该算法不安全)、CRC-32等算法


0x01 常见编码

编码形象的描述:士兵打仗

进攻 ----(编码)---> 鼓声  ----(传输)---> 士兵 ----(解密)---> 行为

字符编码
描述:Character Encoding 也叫字集码,是把字符集中的字符编码指定集和某一对象(列如:比特模式/自然数串行/8位组或者电脉冲),以便文本在计算机中存储和通过通信网络传递;
字符集编码的早期标准:ASCII(1963) 和 EBCDIC (1964)

编码案例:

ASCII码表: 十进制48[0] - 65[A] - 95[a],注意32后为可见字符;
Morse Code编码:-- --- .-. ... . -....- -.-. --- -.. .
URL编码: http://www.oschina.net/search?scope%20=%20bbs&q=C%E8%AF%AD%E8%A8%80
Unicode编码:\u8fd9\u662f\u4e2d\u6587
Utf-8编码:汉字
HTML实体编码:<html lang="zh_cn">
Base64编码:6YeN5bqG5piv5Liq576O5Li95b6X5Z+O5biCCg==
十六进制编码:313233343536373839 (123456789)

WeiyiGeek.


0. ASCII码表

描述:Aerican Standard Code for Information Interchange,美国信息交换标准代码是基于拉丁字母的一套电脑编码系统;主要显示现代英语它的扩展版本EASCII则支持西欧语言,并等于国际标准ISO/IEC646;


1. 莫尔斯电码(Morse Code)

描述:是一种时通时断的信号代码,通过点(.)/划(-)/每个字符间短的停顿(在点和划之间的停顿)/每个词之间中等的停顿以及句子之间的长的停顿;即通过不同的排列组合顺序来表达不同的英文字母,数字和标点符号;莫尔斯电码在海事通信中被作为国际标准一直使用到1999年;

WeiyiGeek.

小故事:
我们经常看一些谍战剧,谍战剧里敌特、地下党员以及八路军各部间发送情报的时候,一般都是通过电报发送的,电报在传递的过程中,需要发报员用电键发出长短不一的电码,收报员就会听到电报机发出的滴滴滴答答答的声音。
其实电报发出的声音都是”滴”和”答”的组合,”答”的声音是”滴”的三倍长,而且在谍战剧中将情报转成电报的”滴”和”答”声主要通过摩尔斯电码;
发报员要先通过一种方式,将想要发送的情报转成电报的滴答声,收报员在听到滴答声之后,再将它们翻译成正常的文字。这个过程就是字符编码和字符解码。


2. Unicode

中文的简称:万国码/国际码/统一码/单一码/是一种为支持全世界所使用的各种编写系统而设计的字符编码标准,它对世界上大部分的文章系统进行了整理/编码;Unicode涵盖的数据除了视觉上的字形.编码方法/标准的字符编码外还包含了字符特性如大小写字符;

由于它采用各种编码方案,其中一些可用于表示Web应用程序中的不常见字符;

16位Unicode编码的工作原理与URL编码类似;
特点:16位Unicode编码的字符以%u为前缀,其后是这个字符的十六进制Unicode码点 %u2215 /


3. UTF-8

表示中文光有一个unicode是不够用的,还有使用其他的编码实现方法,Unicode的实现方法称为Unicode转换格式(Unicode Transformation Format简称UTF),但大多数都会默认显示为utf-8

Q:什么是UTF-8?
答:8-bit Unicode Transformation Format是一种针对Unicode的可变长度的字符编码也是一种前缀码;它使用一个或几个字节表示每个字符。
特点:为通过HTTP进行传输,UTF-8编码的多字节以%为前缀,其后用十六进制表示每个字节 %e2%89%a0等同于;

它可以表示Unicode标准种任何字符,且其编码种的第一个字节任然与ASCII码兼容,这使得原来处理ASCII字符软件部需要或者只做小部分修好即可以继续使用;


4. URL编码

描述:URL编码方案主要用于对扩展ASCII字符集中的任何有问题的字符进行编码(中文),使其可通过HTTP安全传输;

%3d   = 
%25 %
%20 空格
%0a 新行
%00 空字节(文件上传截断)

特点:任何URL编码的字符都以%为前缀,其后是这个字符的二位十六进制ASCII代码;

5.HTML编码

描述:是一种用于表示问题字符以将其安全并入HTML文档的方案。有许多字符具有特殊的含义(如HTML的元字符),并被用于定义文档结构而非其内容;

&quto;   "
' '
&lt; <
&gt; >


6.Base64编码

仅用一个可打印的ASCII字符就可安全转换任何二进制数据,它常用于对电子邮件附件进行编码,使其通过SMTP安全传输;


7.十六进制编码

描述:许多应用程序在传送二进制数据时直接使用十六进制编码,用ASCII字符表示十六进制数据库块。
例如,对cookie中的用户名daf进行十六进制编码,会得到以下结果646166