Django 信息安全 密码学
2015-02-05
https://docs.djangoproject.com/en/2.0/topics/auth/passwords/
在 Django 中,密码哈希存储在 auth_user 表中的 password 字段中。该字段的值包含了算法名称、迭代次数、盐值和哈希值,它们都是使用特定的格式进行编码的。例如,一个密码哈希的值可能如下所示:
pbkdf2_sha256$150000$V7v0fjbhMIhq$Gd/0XuOqK3ib6NBNGVwIKGXcFTUiNbTzdTNN8RiW24E=
用美元符号切割,得到 4 部分:
pbkdf2_sha256 算法名称
150000 迭代次数
V7v0fjbhMIhq 盐
Gd/0XuOqK3ib6NBNGVwIKGXcFTUiNbTzdTNN8RiW24E=
支持的哈希算法
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
]
默认使用的是 PBKDF2PasswordHasher:
PBKDF2 是基于密钥的密码派生函数,它使用一个伪随机函数(PRF)和一个盐值来从给定密码派生出一个密钥。
PBKDF2 算法的核心是迭代的使用 PRF 函数,将每一次迭代的输出与前一次迭代的输出进行异或,生成最终的派生密钥。
大概逻辑如下:
import hashlib
import binascii
import os
class PBKDF2PasswordHasher:
algorithm = 'pbkdf2_sha256'
iterations = 100000
def salt(self):
return binascii.hexlify(os.urandom(16)).decode()
def encode(self, password, salt):
dk = hashlib.pbkdf2_hmac('sha256', password.encode(), salt.encode(), self.iterations)
return '%d$%s$%s' % (self.iterations, salt, binascii.hexlify(dk).decode())
def verify(self, password, encoded):
iterations, salt, dk = encoded.split('$')
iterations = int(iterations)
hashed_password = self.encode(password, salt)
return hashed_password == encoded
生成密码
from django.contrib.auth.hashers import make_password
password = '123456'
hashed_password = make_password(password)
验证密码
from django.contrib.auth.hashers import check_password
is_correct_password = check_password(password, hashed_password)
Web JavaScript
2015-01-30
Linux 压缩 zip unzip
2015-01-19
zip -e archive.zip file1.txt file2.txt
unzip -l archive.zip # 列出
# 解压缩
unzip archive.zip
unzip -o archive.zip # 覆盖
unzip archive.zip file1.txt file2.txt -d /path/to/directory/ # 指定文件,指定目录
unzip -P password archive.zip # 有密码的压缩文件
Linux
2015-01-17
信号
信号可以被捕获,或者被忽略,除了 9 KILL 和 19 STOP。
信号值
Ubuntu:
$ kill -l
HUP INT QUIT ILL TRAP IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS
$ type kill
kill is a shell builtin
$ /usr/bin/kill -L
1 HUP 2 INT 3 QUIT 4 ILL 5 TRAP 6 ABRT 7 BUS
8 FPE 9 KILL 10 USR1 11 SEGV 12 USR2 13 PIPE 14 ALRM
15 TERM 16 STKFLT 17 CHLD 18 CONT 19 STOP 20 TSTP 21 TTIN
22 TTOU 23 URG 24 XCPU 25 XFSZ 26 VTALRM 27 PROF 28 WINCH
29 POLL 30 PWR 31 SYS
CentOS:
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
HUP 终端关闭
INT Ctrl + C
QUIT 终端退出 Ctrl + 4 or \
ILL
TRAP
IOT/ABRT
BUS
FPE
KILL 常来自 kill -9
USR1
SEGV
USR2
PIPE
ALRM
TERM
STKFLT
CHLD 子进程终止
CONT
STOP
TSTP 终端挂起 Ctrl + Z
TTIN
TTOU
URG
XCPU
XFSZ
VTALRM
PROF
WINCH 终端窗口大小改变
POLL
PWR
SYS
由于 9 KILL 不能被捕获,设计软件时可以捕获 15 TERM, 进行清理操作,然后需要杀进程时,先尝试 kill -15。
附: 信号表(来自 man 7 signal)
| Signal |
x86/ARM most others |
Alpha/ SPARC |
MIPS |
PARISC |
Notes |
| SIGHUP |
1 |
1 |
1 |
1 |
|
| SIGINT |
2 |
2 |
2 |
2 |
|
| SIGQUIT |
3 |
3 |
3 |
3 |
|
| SIGILL |
4 |
4 |
4 |
4 |
|
| SIGTRAP |
5 |
5 |
5 |
5 |
|
| SIGABRT |
6 |
6 |
6 |
6 |
|
| SIGIOT |
6 |
6 |
6 |
6 |
|
| SIGBUS |
7 |
10 |
10 |
10 |
|
| SIGEMT |
- |
7 |
7 |
- |
|
| SIGFPE |
8 |
8 |
8 |
8 |
|
| SIGKILL |
9 |
9 |
9 |
9 |
|
| SIGUSR1 |
10 |
30 |
16 |
16 |
|
| SIGSEGV |
11 |
11 |
11 |
11 |
|
| SIGUSR2 |
12 |
31 |
17 |
17 |
|
| SIGPIPE |
13 |
13 |
13 |
13 |
|
| SIGALRM |
14 |
14 |
14 |
14 |
|
| SIGTERM |
15 |
15 |
15 |
15 |
|
| SIGSTKFLT |
16 |
- |
- |
7 |
|
| SIGCHLD |
17 |
20 |
18 |
18 |
|
| SIGCLD |
- |
- |
18 |
- |
|
| SIGCONT |
18 |
19 |
25 |
26 |
|
| SIGSTOP |
19 |
17 |
23 |
24 |
|
| SIGTSTP |
20 |
18 |
24 |
25 |
|
| SIGTTIN |
21 |
21 |
26 |
27 |
|
| SIGTTOU |
22 |
22 |
27 |
28 |
|
| SIGURG |
23 |
16 |
21 |
29 |
|
| SIGXCPU |
24 |
24 |
30 |
12 |
|
| SIGXFSZ |
25 |
25 |
31 |
30 |
|
| SIGVTALRM |
26 |
26 |
28 |
20 |
|
| SIGPROF |
27 |
27 |
29 |
21 |
|
| SIGWINCH |
28 |
28 |
20 |
23 |
|
| SIGIO |
29 |
23 |
22 |
22 |
|
| SIGPOLL |
|
|
|
|
Same as SIGIO |
| SIGPWR |
30 |
29/- |
19 |
19 |
|
| SIGINFO |
- |
29/- |
- |
- |
|
| SIGLOST |
- |
-/29 |
- |
- |
|
| SIGSYS |
31 |
12 |
12 |
31 |
|
| SIGUNUSED |
31 |
- |
- |
31 |
|
WebDev Apache
2015-01-04
2.2 版本下的权限控制语句在 2.4 下已经不再适用,需要做一些调整。
Order deny,allow
Deny from all
应该改成:Require all denied
Order deny,allow
Deny from all
Allow from example.com
应该改成:Require host example.com
Order allow,deny
Allow from all
应该改成:Require all granted
嗯,挺好,新语法更加简单。
Linux
2015-01-03
Linux 文件的三种时间:
atime 访问时间 Access
ctime 修改时间 Change, 文件状态变化
mtime 修改时间 Modify, 文件内容变化
注意:如果 chmod,chown,mv 等不改变文件内容的操作,ctime 变化,mtime 不变。
但是文件内容变化的时候,ctime 和 mtime 都会变化,文件大小没有变化也是一样。
如果通过充定向的方式改变文件内容(> or >>),atime 不会发生变化。
之前有一个测试,可以参考: 2013/04/07, ls 按时间排序
Linux 并没有创建时间,这是令人费解的,可能是早期文件系统没有这个信息吧。
PS: 关于文件的创建时间,参考:2021-12-12 Linux 文件创建时间。
WebDev
2015-01-02
- HRM: Human Resource Management 人力资源管理
- CRM: Customer Relationship Management 客户关系管理
- OA: Office Automation 办公自动化
- ERP: Enterprise Resource Planning 企业资源计划
- SCM: Supply Chain Management
- EAM: Enterprise Asset Management
- FM: Financial Management 财务管理
- PLM: Product Lifecycle Management 产品生命周期管理
- WMS: Warehouse Management System 仓库管理系统
- BPM: Business Process Management 业务流程管理
- MIS: Management Information System 管理信息系统
- EIS: Enterprise Information System 企业信息系统
- OIS: Operations Information System 运营信息系统
- ESS: Enterprise Service System 企业服务系统
- CSM: Customer Service Management 客户服务管理
- BSS: Business Support System 业务支持系统
制造业
- MES: Manufacturing Engineering System 工艺设计系统
建筑业
- BIM: Building Information Model 建筑信息模型
医院
- HIS: Hospital Information System 医院信息化系统
- LIS: Laboratory Information System 化验室信息化系统
- PACS: Patient Administration and Care System 患者管理和护理系统
阅读 美文佳句
2014-11-21
所谓「大内档案」 这东西,在清朝的内阁里积存了三百多年,在孔庙里塞了十多年,谁也一声不响。自从历史博物馆将这残余卖给纸铺子,纸铺子转卖给罗振玉,罗振玉转卖给日本人,于是乎大有号啕之声,仿佛国宝已失,国脉随之似的。前几年,我也曾经过几个人的议论,所记得是的一个是金梁,登在《东方杂志》上;还有罗振玉和王国维,随时发感慨。最近的是《北新半月刊》上的《论档案的售出》蒋彝潜先生做的。
DNS
2014-11-01
在日常网络排查中,我们经常会把域名解析成 IP 地址,例如将 www.example.com 解析为 93.184.216.34。这个过程叫做正向解析(Forward DNS Lookup)。
而 DNS 反解(Reverse DNS Lookup)则正好相反:根据 IP 地址查询对应的域名。
-> % dig +noall +answer -x 8.8.8.8
8.8.8.8.in-addr.arpa. 17864 IN PTR dns.google.
这里表示 IP 地址 8.8.8.8 对应的主机名为 dns.google。
原理
核心:DNS PTR(Pointer)记录。
DNS 设计了一套特殊域名空间:in-addr.arpa,比如要查询 120.48.97.18 的反解记录,就去查询域名 18.97.48.120.in-addr.arpa.(IPv4 地址倒序)的 PTR 记录。
可以通过以下命令观察全过程:
dig +trace -x 8.8.8.8
IPv6 地址反解
只是域名空间改成了 ip6.arpa 而已,然后地址变长了一些,不再是 4 段,而是 32 段。
IPv4 地址 32 bits,每段 8 bits(0-255),分成 4 段。
IPv6 地址 128 bits,每段 4 bits(0-f),分成 32 段。
-> % dig +noall +answer -x 2001:4860:4860::8888
8.8.8.8.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.6.8.4.0.6.8.4.1.0.0.2.ip6.arpa. 9710 IN PTR dns.google.
注意
- 多数 IP 没有反向解析。
- 正向解析和反向解析是由不同管理员独立配置,不一定对应。
- PTR 记录通常由 IP 地址拥有者配置,普通人无法直接操作。
如果是云服务商提供的 IP,要看他们是否提供了 “反向解析” 或 “PTR Record” 配置功能,如果没有就只能提交工单,找售后了。
应用场景
核心的应用场景:邮件系统会检查发信 IP 是否存在合法 PTR 记录。
邮件系统经常要求正反向一致验证,英文叫做 Forward Confirmed Reverse DNS (FCrDNS)。
我随便找了一封阿里云的邮件,根据 Received 中给的发信 IP 做一个检验:
-> % dig +noall +answer -x 47.90.197.163
163.197.90.47.in-addr.arpa. 7200 IN PTR out197-163.us.a.dm.aliyun.com.
-> % dig +noall +answer out197-163.us.a.dm.aliyun.com.
out197-163.us.a.dm.aliyun.com. 60 IN A 47.90.197.163
这里面 47.90.197.163 和 out197-163.us.a.dm.aliyun.com. 就是能够互相对应的。
很多邮件服务商会将 FCrDNS 作为信誉评估的重要指标,如果没有对应上,邮件可能被判定为可疑来源。
除此之外,反解还可辅助判断 IP 归属:
- 运维排查异常连接时手动反查;
- 部分服务写日志时会自动记录 PTR 主机名;
- 少数系统也用于访问控制。
参考资料与拓展阅读
Windows DNS
2014-10-23
nslookup 是用于查询 DNS(域名系统)信息的命令行工具,可查看域名对应的 IP 地址、邮件服务器、名称服务器等记录。它支持指定 DNS 服务器、查询不同记录类型,并可用于排查域名解析问题。Linux、macOS 和 Windows 都提供该工具,是网络运维与故障诊断中最常用的 DNS 调试命令之一。
PS C:\Users\nosch> nslookup /?
用法:
nslookup [-opt ...] # 使用默认服务器的交互模式
nslookup [-opt ...] - server # 使用 "server" 的交互模式
nslookup [-opt ...] host # 仅查找使用默认服务器的 "host"
nslookup [-opt ...] host server # 仅查找使用 "server" 的 "host"1
PS C:\Users\nosch> nslookup
默认服务器: UnKnown
Address: 192.168.1.1
> help
命令: (标识符以大写表示,[] 表示可选)
NAME - 打印有关使用默认服务器的主机/域 NAME 的信息
NAME1 NAME2 - 同上,但将 NAME2 用作服务器
help or ? - 打印有关常用命令的信息
set OPTION - 设置选项
all - 打印选项、当前服务器和主机
[no]debug - 打印调试信息
[no]d2 - 打印详细的调试信息
[no]defname - 将域名附加到每个查询
[no]recurse - 询问查询的递归应答
[no]search - 使用域搜索列表
[no]vc - 始终使用虚拟电路
domain=NAME - 将默认域名设置为 NAME
srchlist=N1[/N2/.../N6] - 将域设置为 N1,并将搜索列表设置为 N1、N2 等
root=NAME - 将根服务器设置为 NAME
retry=X - 将重试次数设置为 X
timeout=X - 将初始超时间隔设置为 X 秒
type=X - 设置查询类型(如 A、AAAA、A+AAAA、ANY、CNAME、MX、
NS、PTR、SOA 和 SRV)
querytype=X - 与类型相同
class=X - 设置查询类(如 IN (Internet)和 ANY)
[no]msxfr - 使用 MS 快速区域传送
ixfrver=X - 用于 IXFR 传送请求的当前版本
server NAME - 将默认服务器设置为 NAME,使用当前默认服务器
lserver NAME - 将默认服务器设置为 NAME,使用初始服务器
root - 将当前默认服务器设置为根服务器
ls [opt] DOMAIN [> FILE] - 列出 DOMAIN 中的地址(可选: 输出到文件 FILE)
-a - 列出规范名称和别名
-d - 列出所有记录
-t TYPE - 列出给定 RFC 记录类型(例如 A、CNAME、MX、NS 和 PTR 等)
的记录
view FILE - 对 'ls' 输出文件排序,并使用 pg 查看
exit - 退出程序
常用命令清单
| 命令 |
作用 |
| nslookup qq.com |
查询域名的 A 记录(IPv4 地址) |
| nslookup -type=AAAA qq.com |
查询 AAAA 记录(IPv6 地址) |
| nslookup -type=MX qq.com |
查询邮件服务器记录 |
| nslookup -type=NS qq.com |
查询权威名称服务器记录 |
| nslookup -type=TXT qq.com |
查询 TXT 记录(如 SPF、DKIM) |
| nslookup 8.8.8.8 |
反向查询 IP 对应的域名 |
| nslookup qq.com 1.1.1.1 |
使用指定 DNS 服务器进行查询 |
| nslookup |
进入交互模式,可连续执行多次查询 |
| set type=MX |
在交互模式中设置查询类型为 MX |
| server 8.8.8.8 |
在交互模式中切换 DNS 服务器 |
| exit |
退出交互模式 |