Apache賬戶密碼加密方式介紹


一、apache密碼存儲格式

apache的用戶密碼一般會生成保存在.htpasswd文件中,保存路徑由用戶創建時確定,根據使用加密算法有五種保存格式:

 

【注】:如果用戶指定了保存密碼的文件名,視用戶指定的文件名而定,默認生成的是.htpasswd文件

 

1.1  bcrypt

"$2y$" + encrypted

示例:

myName:$2y$05$c4WoMPo3SXsafkva.HHa6uXQZWr7oboPiC2bT/r7q1BB8I2s0BRqC

其中,myNmae表示用戶名,$是分割符,無意義;2ybcrypt加密版本號;05cost的值;而后的前22位是salt值;再然后的字符串就是密碼的密文了。(后面會介紹costsalt用法)

這里是用crypt_blowfish算法加密得到的結果

【注】:bcryptapache2.4以后的版本才引入的加密算法,2.2版本還未支持該算法(實現源碼在apr庫源文件:crypt_blowfish.c

 

1.2  MD5

"$apr1$" + encrypted

示例:myName:$apr1$r31.....$HqJZimcKQFAMYayBlzkrA/

myName是用戶名,apr1表示使用的MD5算法,r31......表示創建密碼時隨機生成的saltHqJZimcKQFAMYayBlzkrA/是加密后的密文。

這里用的是Apache特定算法,通過使用隨機的32位鹽和明文密碼的各種組合的1000MD5迭代加密得到的結果。(源碼實現在apr庫源文件:apr_md5.c)

 

1.3  SHA1

"{SHA}" + encrypted

示例:myName:{SHA}VBPuJHI7uixaa6LQGWx4s+5GKNE=

myName表示用戶名,{SHA}表示采用的SHA-1算法,綠色部分是加密后的結果

這里對密碼采用base64-encodedSHA-1算法進行加密得到的結果(不安全)

 

1.4  CRYPT

示例:myName:rqXexS6ZhobKA

myName是用戶名,rqsalt值,占兩個字符,綠色部分是加密后的結果

這里采用標准的unix格式,使用傳統的Unix crypt3)函數,對隨機生成的32位鹽(僅使用12位)和密碼的前8個字符進行加密得到的結果(不安全)

 

1.5  明文直接保存

明文存儲安全系數最低,一般不建議使用明文存儲。

 

apache對密碼格式介紹的官方文檔可參考:https://httpd.apache.org/docs/2.4/en/misc/password_encryptions.html 

(若要獲取2.2版本的文檔介紹把鏈接中的2.4改為2.2即可)

 

二、APR介紹

APR(Apache portable Run-time librariesApache可移植運行庫)的目的如其名稱一樣,主要為上層的應用程序提供一個可以跨越多操作系統平台使用的底層支持接口庫。在早期 的Apache版本中,應用程序本身必須能夠處理各種具體操作系統平台的細節,並針對不同的平台調用不同的處理函數。

隨着Apache的進一步開發,Apache組織決定將這些通用的函數獨立出來並發展成為一個新的項目。這樣,APR的開發就從Apache中獨立出來,Apache僅僅是使用 APR而已。目前APR主要還是由Apache使用,不過由於APR的較好的移植性,因此一些需要進行移植的C程序也開始使用APR,開源項目比如 Flood loader(http://httpd.apache.org/test/flood/,該項目用於服務器壓力測試,不僅僅適用於Apache)FreeSwitch(www.freeswitch.org)JXTA-C(http://jxta-c.jxta.org,C版本的JXTA點對點平台實現);商業的項目則包括Blogline(http://www.bloglines.com/covalent(http://www.covalent.net)等等

APR使得平台細節的處理進行下移。對於應用程序而言,它們根本就不需要考慮具體的平台,不管是UnixLinux還是Window,應用程序執行的接口基本都是統一一致的。因此對於APR而言,可移植性和統一的上層接口是其考慮的一個重點。而APR最早的目的並不是如此,它最早只是希望將Apache中用到的所有代碼合並為一個通用的代碼庫,然而這不是一個正確的策略,因此后來APR改變了其目標。有的時候使用公共代碼並不是一件好事,比如如何將一個請求映射到線程或者進程是平台相關的,因此僅僅一個公共的代碼庫並不能完成這種區分。APR的目標則是希望安全合並所有的能夠合並的代碼而不需要犧牲性能。

APR的最早的一個目標就是為所有的平台(不是部分)提供一個公共的統一操作函數接口,這是一個非常了不起的目的,當然也是不現實的一個目標。我們不可能支持所有平台的所有特征,因此APR目前只能為大多數平台提供所有的APR特性支持,包括Win32OS/2BeOSDarwinLinux等等。為了能夠實現這個目標,APR開發者必須為那些不能運行於所有平台的特性創建了一系列的特征宏(FEATURE MACROS)以在各個平台之間區分這些特征。這些特征宏定義非常簡單,通常用APR_HAS_FEATURE參數設置:

如果某個平台具有這個特性,則該宏必須設置為true,比如Linuxwindow都具有內存映射文件,同時APR提供了內存映射文件的操作接口,因此在這兩個平台上,APR_HAS_MMAP宏必須設置,同時ap_mmap_*函數應該將磁盤文件映射為內存並返回適當的狀態碼。如果你的操作系統並不支持內存映射,那么APR_HAS_MMAP必須設置為0,而且所有的ap_mmap_*函數也可以不需要定義。第二步就是對於那些在程序中使用了不支持的函數必須提出警告。

目前APR中支持的基本類型包括下面幾種

apacheapr項目目前有三部分組成,分別是aprapr-utilapr-iconv

  • apr中包含了一些通用的開發組件,包括mmapDSO等等,
  • apr-util該目錄中也是包含了一些常用的開發組件。這些組件與apr目錄下的相比,它們與apache的關系更加密切一些。比如存儲段和存儲段組,加密等等。
  • apr-iconv包中的文件主要用於實現iconv編碼。目前的大部分編碼轉換過程都是與本地編碼相關的。在進行轉換之前必須能夠正確地設置本地編碼。因此假如兩個非本地編碼AB需要轉換,則轉換過程大致為A->Local以及Local->B或者B->Local以及Local->A

 

三、實現原理

實現的原理跟Linux下弱口令檢測類似,只是由於apache的加密方法是在基於標准的加密算法上加入了自己特有的處理的,所以不能直接用linux下的加解密接口來解決此問題,在httpd的源碼中我們發現他們提供了一個專門做驗證的接口apr_password_validate(),該接口說明如下:

所以我們可以調用該接口進行驗證,而該接口依賴於aprapr-util

【注】:crypt加密算法的驗證需要在支持crypt(3)函數的機器上才能用

3.1 下載安裝aprapr-util

1.先去官網(http://apr.apache.org/download.cgi)下載安裝包,或者用現成下好的也可以

2.apr安裝:

# gzip -d apr-1.5.4.tar.gz 

# tar xvf apr-1.5.4.tar 

# cd apr-1.5.4 

# ./configure --prefix=/opt/apr 

./configure --prefix=/opt/apr

make && make install

3.apr-util安裝:

# gzip -d apr-util-1.5.2.tar.gz

# tar xvf apr-util-1.5.2.tar

# cd apr-util-1.5.2 

# ./configure --prefix=/opt/apr-util --with-apr=/opt/apr

# make && make install

3.2 鏈接aprapr-util

 調用apr庫中接口apr_password_validate()實現一個demo,這里只需傳入密碼明文和密碼字符串(用戶名后的所有部分,包括id,saltencrypted),若相等,則返回0,否則返回1

接口:

apache_password_validate(const char *passwd, const char *hash);

輸入:

passwd  明文弱口令

hash    密碼文件中讀取的字符串

輸出:

若相等,則返回0

不相等,返回1

 

使用示例代碼:

const char *hash = "$2y$05$GNaiLiVSH3qRBLzLNxw6oO2mZya3JqAyKfbeTIxcq6SFNZ2r.KG7.";

printf("bcrypt validate result = %d\n",apache_password_validate(“123456”, hash));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM