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 將配置保存到一個外部文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章