#81 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)

#79 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 # 有密码的压缩文件

#78 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
  1. HUP 终端关闭
  2. INT Ctrl + C
  3. QUIT 终端退出 Ctrl + 4 or \
  4. ILL
  5. TRAP
  6. IOT/ABRT
  7. BUS
  8. FPE
  9. KILL 常来自 kill -9
  10. USR1
  11. SEGV
  12. USR2
  13. PIPE
  14. ALRM
  15. TERM
  16. STKFLT
  17. CHLD 子进程终止
  18. CONT
  19. STOP
  20. TSTP 终端挂起 Ctrl + Z
  21. TTIN
  22. TTOU
  23. URG
  24. XCPU
  25. XFSZ
  26. VTALRM
  27. PROF
  28. WINCH 终端窗口大小改变
  29. POLL
  30. PWR
  31. 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

#77 Apache: client denied by server configuration

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

嗯,挺好,新语法更加简单。

#76 Linux 时间: atime, mtime, ctime

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 文件创建时间

#75 常见 Web 系统

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 患者管理和护理系统

#74 鲁迅:谈所谓大内档案

2014-11-21

所谓「大内档案」 这东西,在清朝的内阁里积存了三百多年,在孔庙里塞了十多年,谁也一声不响。自从历史博物馆将这残余卖给纸铺子,纸铺子转卖给罗振玉,罗振玉转卖给日本人,于是乎大有号啕之声,仿佛国宝已失,国脉随之似的。前几年,我也曾经过几个人的议论,所记得是的一个是金梁,登在《东方杂志》上;还有罗振玉和王国维,随时发感慨。最近的是《北新半月刊》上的《论档案的售出》蒋彝潜先生做的。

#73 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.

注意

  1. 多数 IP 没有反向解析。
  2. 正向解析和反向解析是由不同管理员独立配置,不一定对应。
  3. 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 归属:

  1. 运维排查异常连接时手动反查;
  2. 部分服务写日志时会自动记录 PTR 主机名;
  3. 少数系统也用于访问控制。

参考资料与拓展阅读

#72 nslookup

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 退出交互模式