2015-06-18 33 views
1

我正在做一個PAM類型的東西,它需要在/ etc/shadow中檢查用戶的密碼。在suse上的crypt導致段錯誤

通常,這涉及讀取加密ID,鹽和密碼的密碼行。使用ID和salt,可以使用crypt(3)或m_crypt(在同一手冊頁上)對用戶提供的密碼進行散列處理,並將結果進行比較。這在很多系統上都能正常工作,比如Ubuntu,但是我在SUSE上遇到了很多問題。

系統正在使用Blowfish,以及「正確處理8位字符」。這有一個哈希ID「2y」。不幸的是,每當crypt(3)被調用時,它就會發生段錯誤。 ID「2a」也是一樣,這是識別Blowfish的第一個代碼。所有其他哈希算法都可以工作。

由於/ etc/shadow文件有它的例子,系統必須有一個能夠進行Blowfish哈希的可操作的crypt(或等價物),但是我無法做到這一點。任何人都可以將我指向正確的方向嗎?

的段錯誤的一個例子:

#define _XOPEN_SOURCE 
#include <unistd.h> 
#include <stdio.h> 

int main(int argc, char** argv) { 
    char *pass = "tqbfjotld"; 
    char *salt = "$2y$10$"; 
    char *pp = NULL; 
    pp = crypt(pass, salt); 
    printf("%s\n", pp); 
    return 0; 
} 

鹽$ 2A $ 10 $還示出了誤差。

它適用於其他系統,如Ubuntu,其他哈希算法可以在SUSE上正常工作。

有什麼想法嗎?

+0

從來沒有用過自己,但'2a'是河豚,什麼是'2y'? –

+0

對crypt的調用返回NULL的值。它是導致seg故障事件的printf(),因爲字符串參數爲NULL。 – user3629249

+0

根據crypt的文檔,鹽必須是指向2個字符串的指針。當我僅使用兩個字符串作爲鹽時,它完美地工作。請閱讀crypt的手冊頁 – user3629249

回答

0

crypt()返回NULL意味着錯誤,因爲2y可能是無效的鹽是未知的。 根據維基百科這似乎是一個相當新的加法: https://en.wikipedia.org/wiki/Crypt_%28C%29

「$ 2Y $ - 後2011的錯誤發現,$ 2Y $可用來明確地使用新的,修正算法從實現的痛苦。這個bug $ 2y $根本無法工作,在一個更新的固定實現中,它將產生與使用$ 2a $相同的結果。「

嘗試使用此方法得到的錯誤:

#include <errno.h> 
printf("%p (errno=%d: %s)\n", pp, errno, strerror(errno)); 

的glibc-2.19不支持任何的河豚算法,我得到新版的Debian 8.1 NULL指針爲好。

也許您的SUSE系統包含隨時間遷移並且甚至不再可用的密碼條目。或者其他一些軟件(如自定義PAM模塊)使用自定義庫評估和檢查密碼條目,而不是使用標準libc crypt()函數。

+0

太遠,我推測2y它可以在這個系統上工作,因爲它使用$ 2y $創建新的用戶帳戶(所以passwd從某處正確地選擇它)。 – PaulaG

+0

錯誤號是22.不幸的是,這並沒有帶一個字符串(strerror返回NULL)。 – PaulaG

+0

我不知道可以運行/lib/libc.so.6,但現在我可以看到可用的擴展名:「Michael Glad和其他人的crypt add-on version 2.1」。這讓我感到困惑,因爲libc中沒有「crypt」函數(其中有common_crypt等)。當我鏈接時,我需要使用-lcrypt。這與libc是分開的,不是嗎? – PaulaG