linux内核2.6.3x--Firmware Drivers、File systems

http://hi.baidu.com/shwkj/item/d15d9129ae3fff8daf48f5af

Firmware Drivers  --->

固件就是你板上的BIOS、各种显卡芯片之类的已经固化好的记录某些特定数据的东西。
< > BIOS Enhanced Disk Drive calls determine boot disk
BIOS加强磁盘功能,确定启动盘。
选y或M,如果你要使用BIOS加强磁盘服务功能来确定BIOS用哪个磁盘来启动。启动后这个信息会反映在系统文件中。
这个选项是实验性的,而且已经被确认在某些未测试选项下会启动失败。很多磁盘控制器的BIOS供应商都不支持这个特性。
<*> EFI Variable Support via sysfs
< > BIOS update support for DELL systems via sysfs
用于DELL机器的BIOS升级支持。
< > Dell Systems Management Base Driver 
DELL系统管理器的基本驱动。
[*] Export DMI identification via sysfs to userspace
[ ] iSCSI Boot Firmware Table Attributes


File systems  ---> 文件系统
有人说在编译内核时应该将/boot分区和/分区的文件系统编译进内核,其它的可以编译成模块。对,但不确切。让我们来一起了解一下linux系统的启动 顺序。在内核被加载后,如果initrd参数传入了内核,内核会去调用指定的文件。当然,initrd和System.map通常都是 /boot下。但是同样可以用initrd=(hd1,2)/initrd.img这样的方式指定。内核启动完成后将调用/sbin/init,(如果是 链接要保证目标文件能被内核加载)。不同的系统的启动脚本可能不太一样,这里不详细介绍。启动脚本向内核加载模块时可能用/sbin/modprobe或 /sbin/insmod,由此看来/sbin的文件系统是要内核支持的。编译的内核模块一般在/lib/modules/的版本目录下,所以 /lib/modules的文件系统是要内核支持的。一旦其它文件系统的模块能加载,系统就能向正常的访问内核中的文件系统一样访问模块支持的文件系统 了。由于启动脚本、fstab自动加载等文件一般在/etc目录下,因此/etc的文件系统是要内核支持的。

上面的解释很复杂,如果你不清楚,那么就把2.6.19.1提供的: Ext2 、 Ext3、 Ext4、Reiserfs 全部都编进内核。不要以为少编点东西进内核,速度就会快,性能就会好。现在的PC都很好了,那点速度差别是看不出来的。我在XP下开IE,和在 Ubuntu下开FIREFOX,速度上根本感觉不出来。至于哪个快?自己用垃圾机器去做实验吧。

如果你没用过EXT4的话,现在可以用用了呵呵。用命令:mkfs来搞。不过会删除硬盘的东西,要小心。我是不知道EXT4是什么回事的。其实我到现在也 还不知道FAT、NTFS、EXT-N等文件系统到底是什么玩意,有什么作用。也懒得去研究。

下面还有JFS、XFS等文件系统支持,关键的已经进内核了,其他的编为模块就行。要是确定不会用到,不编也行。万一真用到了就去网上下载,或者重编译系 统。
< > Second extended fs support
Ext2文件系统是Linux的标准文件系统,擅长处理稀疏文件
[ ]   Ext2 extended attributes (NEW)
[ ]   Ext2 execute in place support (NEW)
程序在写入存储介质时就已经分配好运行时的地址,因此不需要载入内存即可在芯片内执行,一般仅在嵌入式系统上才有这种设备
<*> Ext3 journalling file system support
Ext3性能平庸,使用journal日志模式时数据完整性非常好(但怪异的是此时多线程并发读写速度却最快)
[ ]   Default to 'data=ordered' in ext3
[*]   Ext3 extended attributes 
Ext3文件系统扩展属性(与inode关联的name:value对)支持
[*]     Ext3 POSIX Access Control Lists
POSIX ACL(访问控制列表)支持,可以更精细的针对每个用户进行访问控制,需要外部库和程序的支持
[*]     Ext3 Security Labels 
安全标签允许选择使用不同的安全模型实现(如SELinux)的访问控制模型,如果你没有使用需要扩展属性的安全模型就别选
< > The Extended 4 (ext4) filesystem尚处于开发状态的Ext4
[ ] JBD (ext3) debugging support仅供开发者使用
< > Reiserfs support
性能几乎全面超越Ext2(处理稀疏文件比Ext2慢),小文件(小于4k)性能非常突出,创建和删除文件速度最快,处理大量目录和文件(5k-20k) 时仍然非常迅速.日志模式建议使用Ordered,追求极速可使用Writeback模式,追求安全可使用Journal模式.建议使用 noatime,notail选项挂载分区以提高速度和避免bug.用于NFS和磁盘限额时需要额外的补丁
[ ]   Enable reiserfs debug mode (NEW)启用ReiserFS调试模式,仅供开发者使用
[ ]   Stats in /proc/fs/reiserfs (NEW)
在/proc/fs/reiserfs文件中显示Reiserfs文件系统的状态,仅供开发者使用
[ ]   ReiserFS extended attributes (NEW)
ReiserFS文件系统扩展属性(与inode关联的name:value对)支持
< > JFS filesystem support  IBM的JFS文件系统
< > XFS filesystem support
碎片最少,多线程并发读写最佳,大文件(>64k)性能最佳,创建和删除文件速度较慢.由于XFS在内存中缓存尽可能多的数据且仅当内存不足时才会 将数据刷到磁盘,所以应当仅在确保电力供应不会中断的情况下才使用XFS
< > GFS2 file system support 一种用于集群的文件系统
< > OCFS2 file system support  一种用于集群的文件系统
< > Btrfs filesystem (EXPERIMENTAL) Unstable disk format
< > NILFS2 file system support (EXPERIMENTAL)
[*] Dnotify support
旧式的基于目录的文件变化的通知机制(新机制是Inotify),目前仍然有一些程序依赖它
-*- Inotify file change notification support
文件变更支持。有点像碎片整理的意思。选了。
[*] Inotify support for userspace 
[*] Quota support
配额支持。也就是说限制某个用户或者某组用户的磁盘占用空间。
[*]   Report quota messages through netlink interface
[ ]   Print quota warnings to console (OBSOLETE)
< > Old quota format support老式的配额格式支持
<*> Quota format v2 support新的v2格式允许使用32位的UID/GID配额支持。
< > Kernel automounter support 内核自动加载远程文件系统(v3,就算选也不选这个旧的)
<*> Kernel automounter version 4 support (also supports v3)
新的(v4)的内核自动加载远程文件系统的支持,也支持v3
< > FUSE (Filesystem in Userspace) support
FUSE允许在用户空间实现一个文件系统,如果你打算开发一个自己的文件系统或者使用一个基于FUSE的文件系统就选吧
Caches  ---> 
< > General filesystem local caching manager
CD-ROM/DVD Filesystems  --->CD-ROM/DVD文件系统
<*> ISO 9660 CDROM file system support 
CD-ROM的标准文件系统
[*]   Microsoft Joliet CDROM extensions
Microsoft对ISO 9660文件系统的Joliet扩展,允许在文件名中使用Unicode字符,也允许长文件名
[*]   Transparent decompression extension
Linux对ISO 9660文件系统的扩展,允许将数据透明的压缩存储在CD上
< > UDF file system support某些新式CD/DVD上的文件系统,很少见
DOS/FAT/NT Filesystems  --->DOS/Windows的文件系统
<*> MSDOS fs support古老的MSDOS文件系统
<*> VFAT (Windows-95) fs support
从Win95开始使用的VFAT文件系统
(437) Default codepage for FAT默认代码页
(iso8859-1) Default iocharset for FAT默认字符集
< > NTFS file system support
从WinNT开始使用的NTFS文件系统
[ ]   NTFS debugging support (NEW)
仅供调试使用
[ ]   NTFS write support (NEW)
NTFS写入支持
Pseudo filesystems  --->伪文件系统
-*- /proc file system support
显示系统状态的虚拟文件系统(irq设置,内存使用,加载的设备驱动器,网络状态等),许多程序依赖于它
[*]   /proc/kcore support系统物理内存的映象
[*]   /proc/vmcore support (EXPERIMENTAL)
以ELF格式转储的已崩溃内核镜像,仅供调试使用
[*] Virtual memory file system support (former shm fs
tmpfs文件系统(以前叫shm[共享内存]文件系统)支持
[*]   Tmpfs POSIX Access Control Lists
POSIX ACL(访问控制列表)支持,可以更精细的针对每个用户进行访问控制,需要外部库和程序的支持
[*] HugeTLB file system support
大多数现代计算机体系结构提供对多种内存页面大小的支持(比如IA-32结构支持4K和4M(PAE模式为2M)两种页 面).TLB(Translation Lookaside Buffer)是虚拟地址到物理地址的翻译缓冲区,这种缓冲区在处理器上是很宝贵的,操作系统总是尝试将有限的TLB资源发挥到极致.特别是能够轻松获得 若干G内存的时候(>4G),这种优化就显得尤为关键.只有开启此选项之后才能提供hugepage支持.
< > Userspace-driven configuration filesystem
configfs是用户空间驱动的文件系统,提供与sysfs相反的功能
[*] Miscellaneous filesystems  --->非主流的杂项文件系统
<*> Compressed ROM file system support (cramfs) 对ROM的支持,这里要选上!否则会出现:

VFS:Cannot open root device “hdxy” or unknow-block(0,0)

Please append a correct “root=” boot option

kernel panic-not syncing: VFS:Unable to mount root fs on unknow-block(0,0) 这种故障现象!够你郁闷好几天!

其他的默认就行。懒得看了。
[*] Network File Systems  --->网络文件系统
里面有NFS和SAMBA的文件系统呵。默认是选上的,就不用管了
<*>   NFS client support 
[*]     NFS client support for NFS version 3
[*]       NFS client support for the NFSv3 ACL protocol
[*]     NFS client support for NFS version 4 (EXPERIMENTAL)
[ ]       NFS client support for NFSv4.1 (DEVELOPER ONLY)
[*]     Root file system on NFS
< >   NFS server support
-*-   Secure RPC: Kerberos V mechanism (EXPERIMENTAL)
< >   Secure RPC: SPKM3 mechanism (EXPERIMENTAL)
< >   SMB file system support (OBSOLETE, please use CIFS)
< >   CIFS support (advanced network filesystem, SMBFS 
< >   NCP file system support (to mount NetWare volumes)
< >   Coda file system support (advanced network fs)
< >   Andrew File System support (AFS) (EXPERIMENTAL) 
Partition Types  --->高级磁盘分区类型,不确定可以全不选
[*] Advanced partition selection
高级分区选择,如果你不是用Linux来管理硬盘分区表,选这个。一般来说,要选,而且要选上里面的WINDOWS选项。因为我的硬盘是在WINDOWS 下格式化分区的。
[ ]   Acorn partition support
[*]   Alpha OSF partition support
[*]   Amiga partition table support 
[ ]   Atari partition table support
[*]   Macintosh partition map support
[*]   PC BIOS (MSDOS partition tables) support
[*]     BSD disklabel (FreeBSD partition tables) support
[*]     Minix subpartition support
[*]     Solaris (x86) partition table support
[*]     Unixware slices support 
[ ]   Windows Logical Disk Manager (Dynamic Disk) support
[*]   SGI partition support
[ ]   Ultrix partition table support
[*]   Sun partition tables support 
[*]   Karma Partition support
[*]   EFI GUID Partition support
[ ]   SYSV68 partition table support
-*- Native language support  --->   
本地语言支持.如果你仅仅使用几种主流的Linux文件系统(ext2/3/4,Reiserfs,JFS,XFS),就不需要这个东西.但是如果你需要 使用FAT/NTFS分区的话,就需要这个东西了.
(utf8) Default NLS Option默认本地语言,建议使用UTF-8
<*>   Codepage 437 (United States, Canada)美国、加拿大
< >   Codepage 737 (Greek)希腊语
< >   Codepage 775 (Baltic Rim)
< >   Codepage 850 (Europe)欧洲
< >   Codepage 852 (Central/Eastern Europe)中/东欧
< >   Codepage 855 (Cyrillic)
< >   Codepage 857 (Turkish)土耳其
< >   Codepage 860 (Portuguese)葡萄牙
< >   Codepage 861 (Icelandic)冰岛语
< >   Codepage 862 (Hebrew)
< >   Codepage 863 (Canadian French) 法属加拿大
< >   Codepage 864 (Arabic)阿拉伯
< >   Codepage 865 (Norwegian, Danish)挪威
< >   Codepage 866 (Cyrillic/Russian)
< >   Codepage 869 (Greek)
< >   Simplified Chinese charset (CP936, GB2312)简体中文
< >   Traditional Chinese charset (Big5)繁体中文
< >   Japanese charsets (Shift-JIS, EUC-JP)日本语
< >   Korean charset (CP949, EUC-KR)韩国语
< >   Thai charset (CP874, TIS-620)泰国语
< >   Hebrew charsets (ISO-8859-8, CP1255)
< >   Windows CP1250 (Slavic/Central European Languages)
< >   Windows CP1251 (Bulgarian, Belarusian)
<*>   ASCII (United States)
<*>   NLS ISO 8859-1  (Latin 1; Western European Languages)
< >   NLS ISO 8859-2  (Latin 2; Slavic/Central
< >   NLS ISO 8859-3  (Latin 3; Esperanto,
< >   NLS ISO 8859-4  (Latin 4; old Baltic charset)
< >   NLS ISO 8859-5  (Cyrillic)
< >   NLS ISO 8859-6  (Arabic)
< >   NLS ISO 8859-7  (Modern Greek) 
< >   NLS ISO 8859-9  (Latin 5; Turkish)
< >   NLS ISO 8859-13 (Latin 7; Baltic)
< >   NLS ISO 8859-14 (Latin 8; Celtic)
< >   NLS ISO 8859-15 (Latin 9; Western European Languages
< >   NLS KOI8-R (Russian)
< >   NLS KOI8-U/RU (Ukrainian, Belarusian)
<*>   NLS UTF-8 
< > Distributed Lock Manager (DLM)  --->
通用的分布式锁管理器,不明白就不选
[ ]   DLM debugging (NEW)


Kernel hacking  --->内核hack选项内核调试
[*] Show timing information on printks 
在printk的输出中包含时间信息,可以用来分析内核启动过程各步骤所用时间
[ ] Enable __deprecated logic
[*] Enable __must_check logic
在编译内核的过程中使用"必须检查"的逻辑,禁用它将不会显示某些警告信息
(2048) Warn for stack frames larger than (needs gcc 4.4)
[*] Magic SysRq key 魔术键功能,用alt+PrintScreen+特定键位 的组合键来控制系统,在系统崩溃时特别有用,有点类似win2000的ctrl+alt+del。相关组合键:
[ ] Strip assembler-generated symbols during link
[ ] Enable unused/obsolete exported symbols
导出无用和废弃的符号,这将使内核不必要的增大 
-*- Debug Filesystem不是内核开发者的别选
[ ] Run 'make headers_check' when building vmlinux 
在编译内核时运行'make headers_check'命令检查内核头文件,当你修改了与用户空间相关的内核头文件后建议启用该选项
[*] Kernel debugging不是内核开发者的别选
[ ]   Debug shared IRQ handlers 
[ ]   Detect Soft Lockups
[ ]   Detect Hung Tasks
[ ]   Collect scheduler debugging info
[*]   Collect scheduler statistics 
[*]   Collect kernel timers statistics
[ ]   Debug object operations 
[ ] SLUB debugging on by default
[ ] Enable SLUB performance statistics
[ ] Kernel memory leak detector
[ ] RT Mutex debugging, deadlock detection
[ ] Built-in scriptable tester for rt-mutexes
[ ] Spinlock and rw-lock debugging: basic checks
[ ] Mutex debugging: basic checks
[ ] Lock debugging: detect incorrect freeing of live locks
[ ] Lock debugging: prove locking correctness 
[ ] Lock usage statistics
[ ] Spinlock debugging: sleep-inside-spinlock checking 
[ ] Locking API boot-time self-tests
[ ] kobject debugging
[ ] Highmem debugging
[ ] Compile the kernel with debug info
[ ] Debug VM
[ ] Debug VM translations 
[ ] Debug filesystem writers count
[ ] Debug linked list manipulation
[ ] Debug SG table operations
[ ] Debug notifier call chains
[ ] Debug credential management
[*] Compile the kernel with frame pointers
[ ] Delay each boot printk message by N milliseconds
< > torture tests for RCU
[ ] Check for stalled CPUs delaying RCU grace periods
[ ] Kprobes sanity tests
< > Self test for the backtrace code
[ ] Force extended block device numbers and spread them
[ ] Force weak per-cpu definitions 
< > Linux Kernel Dump Test Tool Module不是内核开发者的别选
[ ] Fault-injection framework
[ ] Latency measuring infrastructure
[*] Sysctl checks
[ ] Debug page memory allocations
[*] Tracers  ---> 
[*] Remote debugging over FireWire early on boot
[ ] Enable dynamic printk() support 
[ ] Enable debugging of DMA-API usage
[ ] Sample kernel code  --->
[ ] KGDB: kernel debugging with remote gdb  --->
[ ] Filter access to /dev/mem
[*] Enable verbose x86 bootup info messages 
-*- Early printk
[*]   Early printk via EHCI debug port
[*] Check for stack overflows
[*] Stack utilization instrumentation
[ ] Debug access to per_cpu maps 
[ ] Export kernel pagetable layout to userspace via debugfs
[*] Write protect kernel read-only data structures
[ ]   Testcase for the DEBUG_RODATA feature 
<M> Testcase for the NX non-executable stack feature
[ ] Use 4Kb for kernel stacks instead of 8Kb
[ ] Enable IOMMU stress-test mode
IO delay type (port 0x80 based port-IO delay [recommended])
[*] Debug boot parameters
[ ] CPA self-test code
[*] Allow gcc to uninline functions marked 'inline' 


Security options  ---> 安全选项
[*] Enable access key retention support
在内核中保留authentication token和access key
[*]   Enable the /proc/keys file by which keys may be viewed
允许有权限的进程通过/proc/keys读取所有的key
[*] Enable different security models
允许内核选择不同的安全模型,如果未选中则内核将使用默认的安全模型
[ ] Enable the securityfs filesystem
[*] Socket and Networking Security Hooks
允许安全模型通过Security Hook对Socket与Networking进行访问控制
[ ]   XFRM (IPSec) Networking Security Hooks启用XFRM安全Hook
[ ] Security hooks for pathname based access control
[*] File POSIX Capabilities 
[ ] Root Plug Support
一个简单的Linux安全模块,在特定的USB设备不存在时它简单的禁止一切egid==0的进程运行
(65536) Low address space for LSM to protect from user allocation
[*] NSA SELinux Support
美国国家安全局(NSA)开发的安全增强Linux(SELinux),你还需要进行策略配置(checkpolicy)并且对文件系统进行标记 (setfiles)
[*]   NSA SELinux boot parameter
添加一个内核引导参数以允许在引导时使用'selinux=0'禁用SELinux或'selinux=1'启用SELinux
(1)     NSA SELinux boot parameter default value 上述参数的默认值
[*]   NSA SELinux runtime disable 允许在运行时禁用SELinux
[*]   NSA SELinux Development Support SELinux开发支持
[*]   NSA SELinux AVC Statistics
搜集存取向量(access vector)缓冲区的统计信息并在/selinux/avc/cache_stats中显示出来.这些信息可以用avcstat之类的工具查看
(1)   NSA SELinux checkreqprot default value checkreqprot标志的默认值
[ ]   NSA SELinux maximum supported policy format version
允许将支持的最高策略格式版本设置为一个特定的数值
[ ] Simplified Mandatory Access Control Kernel Support 
[ ] TOMOYO Linux Support
[ ] Integrity Measurement Architecture(IMA)  
-*- Cryptographic API  --->加密选项密码选项
有MD5和CRC32校验支持,默认选择就是。

MD5 在LINUX中可以用md5sum命令来校验。

md5的全称是message-digest algorithm 5(信息-摘要算法),在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来,经md2、md3和md4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被“压缩“成一种保密的格式(就是把一 个任意长度的字节串变换成一定长的大整数)。不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些 算法的结构或多或少有些相似,但md2的设计与md4和md5完全不同,那是因为md2是为8位机器做过设计优化的,而md4和md5却是面向32位的电 脑。这三个算法的描述和c语言源代码在internet rfcs 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由ronald l. rivest在1992年8月向ieft提交。

rivest在1989年开发出md2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信 息末尾。并且根据这个新产生的信息计算出散列值。后来,rogier和chauvaud发现如果忽略了检验和将产生md2冲突。md2算法的加密后结果是 唯一的–既没有重复。

为了加强算法的安全性,rivest在1990年又开发出md4算法。md4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息 字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要 通过三个不同步骤的处理。den boer和bosselaers以及其他人很快的发现了攻击md4版本中第一步和第三步的漏洞。dobbertin向大家演示了如何利用一部普通的个人电 脑在几分钟内找到md4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,md4就此 被淘汰掉了。

尽管md4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了md5以外,其中比较 有名的还有sha-1、ripe-md以及haval等。

一年以后,即1991年,rivest开发出技术上更为趋近成熟的md5算法。它在md4的基础上增加了“安全-带子“(safety-belts)的概 念。虽然md5比md4稍微慢一些,但却更为安全。这个算法很明显的由四个和md4设计有少许不同的步骤组成。在md5算法中,信息-摘要的大小和填充的 必要条件与md4完全相同。den boer和bosselaers曾发现md5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。

van oorschot和wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索md5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一 个冲突。但单从1991年到2001年这10年间,竟没有出现替代md5算法的md6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有 太多的影响md5的安全性。上面所有这些都不足以成为md5的在实际应用中的问题。并且,由于md5算法的使用不需要支付任何版权费用的,所以在一般的情 况下(非绝密应用领域。但即便是应用在绝密领域内,md5也不失为一种非常优秀的中间技术),md5怎么都应该算得上是非常安全的了。

算法的应用

md5的典型应用是对一段信息(message)产生信息摘要(message-digest),以防止被篡改。比如,在unix下有很多软件在下载的时 候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:

md5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461

这就是tanajiya.tar.gz文件的数字签名。md5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的md5信息 摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文 件重新计算md5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用md5还可以防止文件作者的” 抵赖“,这就是所谓的数字签名应用。

md5还广泛用于加密和解密技术上。比如在unix系统中用户的密码就是以md5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统 把用户输入的密码计算成md5值,然后再去和保存在文件系统中的md5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码 的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。

正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为“跑字典“的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表, 另一种是用排列组合方法生成的,先用md5程序计算出这些字典项的md5值,然后再用目标的md5值在这个字典中检索。我们假设密码的最大长度为8位字节 (8 bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是p(62,1)+p(62,2)….+p (62,8),那也已经是一个很天文的数字了,存储这个字典就需要tb级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码md5值的情况 下才可以。这种加密技术被广泛的应用于unix系统中,这也是为什么unix系统比一般操作系统更为坚固一个重要原因。

算法描述

对md5算法简要的叙述可以为:md5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四 个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

在md5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(bits length)将被扩展至n*512+448,即n*64+56个字节(bytes),n为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个 0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字 节长度=n*512+448+64=(n+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。

md5中有四个32位被称作链接变量(chaining variable)的整数参数,他们分别 为:a=0×01234567,b=0×89abcdef,c=0xfedcba98,d=0×76543210。

当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。

将上面四个链接变量复制到另外四个变量中:a到a,b到b,c到c,d到d。

主循环有四轮(md4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果 加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
以一下是每次操作中用到的四个非线性函数(每轮一个)。

f(x,y,z) =(x&y)|((~x)&z)
g(x,y,z) =(x&z)|(y&(~z))
h(x,y,z) =x^y^z
i(x,y,z)=y^(x|(~z))
(&是与,|是或,~是非,^是异或)

这四个函数的说明:如果x、y和z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
f是一个逐位运算的函数。即,如果x,那么y,否则z。函数h是逐位奇偶操作符。

假设mj表示消息的第j个子分组(从0到15),<<
ff(a,b,c,d,mj,s,ti)表示a=b+((a+(f(b,c,d)+mj+ti)<< gg(a,b,c,d,mj,s,ti)表示a=b+((a+(g(b,c,d)+mj+ti)<< hh(a,b,c,d,mj,s,ti)表示a=b+((a+(h(b,c,d)+mj+ti)<< ii(a,b,c,d,mj,s,ti)表示a=b+((a+(i(b,c,d)+mj+ti)<<
这四轮(64步)是:

第一轮

ff(a,b,c,d,m0,7,0xd76aa478)
ff(d,a,b,c,m1,12,0xe8c7b756)
ff(c,d,a,b,m2,17,0×242070db)
ff(b,c,d,a,m3,22,0xc1bdceee)
ff(a,b,c,d,m4,7,0xf57c0faf)
ff(d,a,b,c,m5,12,0×4787c62a)
ff(c,d,a,b,m6,17,0xa8304613)
ff(b,c,d,a,m7,22,0xfd469501)
ff(a,b,c,d,m8,7,0×698098d8)
ff(d,a,b,c,m9,12,0×8b44f7af)
ff(c,d,a,b,m10,17,0xffff5bb1)
ff(b,c,d,a,m11,22,0×895cd7be)
ff(a,b,c,d,m12,7,0×6b901122)
ff(d,a,b,c,m13,12,0xfd987193)
ff(c,d,a,b,m14,17,0xa679438e)
ff(b,c,d,a,m15,22,0×49b40821)

第二轮

gg(a,b,c,d,m1,5,0xf61e2562)
gg(d,a,b,c,m6,9,0xc040b340)
gg(c,d,a,b,m11,14,0×265e5a51)
gg(b,c,d,a,m0,20,0xe9b6c7aa)
gg(a,b,c,d,m5,5,0xd62f105d)
gg(d,a,b,c,m10,9,0×02441453)
gg(c,d,a,b,m15,14,0xd8a1e681)
gg(b,c,d,a,m4,20,0xe7d3fbc8)
gg(a,b,c,d,m9,5,0×21e1cde6)
gg(d,a,b,c,m14,9,0xc33707d6)
gg(c,d,a,b,m3,14,0xf4d50d87)
gg(b,c,d,a,m8,20,0×455a14ed)
gg(a,b,c,d,m13,5,0xa9e3e905)
gg(d,a,b,c,m2,9,0xfcefa3f8)
gg(c,d,a,b,m7,14,0×676f02d9)
gg(b,c,d,a,m12,20,0×8d2a4c8a)

第三轮

hh(a,b,c,d,m5,4,0xfffa3942)
hh(d,a,b,c,m8,11,0×8771f681)
hh(c,d,a,b,m11,16,0×6d9d6122)
hh(b,c,d,a,m14,23,0xfde5380c)
hh(a,b,c,d,m1,4,0xa4beea44)
hh(d,a,b,c,m4,11,0×4bdecfa9)
hh(c,d,a,b,m7,16,0xf6bb4b60)
hh(b,c,d,a,m10,23,0xbebfbc70)
hh(a,b,c,d,m13,4,0×289b7ec6)
hh(d,a,b,c,m0,11,0xeaa127fa)
hh(c,d,a,b,m3,16,0xd4ef3085)
hh(b,c,d,a,m6,23,0×04881d05)
hh(a,b,c,d,m9,4,0xd9d4d039)
hh(d,a,b,c,m12,11,0xe6db99e5)
hh(c,d,a,b,m15,16,0×1fa27cf8)
hh(b,c,d,a,m2,23,0xc4ac5665)

第四轮

ii(a,b,c,d,m0,6,0xf4292244)
ii(d,a,b,c,m7,10,0×432aff97)
ii(c,d,a,b,m14,15,0xab9423a7)
ii(b,c,d,a,m5,21,0xfc93a039)
ii(a,b,c,d,m12,6,0×655b59c3)
ii(d,a,b,c,m3,10,0×8f0ccc92)
ii(c,d,a,b,m10,15,0xffeff47d)
ii(b,c,d,a,m1,21,0×85845dd1)
ii(a,b,c,d,m8,6,0×6fa87e4f)
ii(d,a,b,c,m15,10,0xfe2ce6e0)
ii(c,d,a,b,m6,15,0xa3014314)
ii(b,c,d,a,m13,21,0×4e0811a1)
ii(a,b,c,d,m4,6,0xf7537e82)
ii(d,a,b,c,m11,10,0xbd3af235)
ii(c,d,a,b,m2,15,0×2ad7d2bb)
ii(b,c,d,a,m9,21,0xeb86d391)

常数ti可以如下选择:

在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。(4294967296等于2的32次方)
所有这些完成之后,将a、b、c、d分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出是a、b、c和d的级联。

当你按照我上面所说的方法实现md5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。

md5 (”") = d41d8cd98f00b204e9800998ecf8427e
md5 (”a”) = 0cc175b9c0f1b6a831c399e269772661
md5 (”abc”) = 900150983cd24fb0d6963f7d28e17f72
md5 (”message digest”) = f96b697d7cb7938d525a2f31aaf161d0
md5 (”abcdefghijklmnopqrstuvwxyz”) = c3fcd3d76192e4007dfb496cca67e13b
md5 (”abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789″) =
d174ab98d277d9f5a5611c2c9f419d9f
md5 (”123456789012345678901234567890123456789012345678901234567890123456789
01234567890″) = 57edf4a22be3c955ac49da2e2107b67a

如果你用上面的信息分别对你做的md5算法实例做测试,最后得出的结论和标准答案完全一样,那我就要在这里象你道一声祝贺了。要知道,我的程序在第一次编 译成功的时候是没有得出和上面相同的结果的。

md5的安全性

md5相对md4所作的改进:

1. 增加了第四轮;

2. 每一步均有唯一的加法常数;

3. 为减弱第二轮中函数g的对称性从(x&y)|(x&z)|(y&z)变为(x&z)|(y&(~z));

4. 第一步加上了上一步的结果,这将引起更快的雪崩效应;

5. 改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似;

6. 近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应。各轮的位移量互不相同。
[color=red]简单的说:

MD5叫信息-摘要算法,是一种密码的算法,它可以对任何文件产生一个唯一的MD5验证码,每个文件的MD5码就如同每个人的指纹一样,都是不同的,这 样,一旦这个文件在传输过程中,其内容被损坏或者被修改的话,那么这个文件的MD5码就会发生变化,通过对文件MD5的验证,可以得知获得的文件是否完 整。


[*] Virtualization  --->
< >   Kernel-based Virtual Machine (KVM) support
< >   Linux hypervisor example code
< >   PCI driver for virtio devices (EXPERIMENTAL)
< >   Virtio balloon driver (EXPERIMENTAL)
Library routines  --->   库子程序 常规的库
CRC(循环冗余检查)–一种数据传输检错功能,对数据进行多项式计算,并将得到的和数附在帧的后面。接收设备也执行类似的算法。
< > CRC-CCITT functions传送8-bit字符,欧洲标准
< > CRC16 functions传送8-bit字符,美国标准
<*> CRC calculation for the T10 Data Integrity Field
< > CRC ITU-T V.41 functions
-*- CRC32 functions用于点对点的同步数据传输中,传输网络数据包所必须的
< > CRC7 functions
< > CRC32c (Castagnoli, et al) Cyclic Redundancy-Check
用于点对点的同步数据传输中,比如iSCSI设备
Load an Alternate Configuration File 读入一个外部配置文件
Save an Alternate Configuration File 将配置保存到一个外部文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值