私の関連質問があまり注目されていないようで、別の質問があります。 今日、Linuxでユーザー名/パスワードプロンプトでユーザーを認証する正しい方法は何ですか?
原則として、ユーザー名とパスワードを取得して、そのユーザーのソルトとハッシュを読む必要があると思います/etc/shadow
。次に、与えられたパスワードと保存されたソルトのハッシュを計算し、結果が/etc/shadow
。
通常、すでにすべての操作を実行しているPAM(たとえば)を介して簡単に認証できますが、pam_unix
私のアプリケーションはカスタムPAMモジュールであり、別のPAMモジュールから1つのPAMモジュールを呼び出す方法を見つけることができませんでした。これが可能であれば、喜んでこのソリューションを採用します。
現時点では、このチュートリアルは本当に古いようです。http://www.tldp.org/HOWTO/Shadow-Password-HOWTO-8.html1996年現在、libcにはシャドウサポートがまだ組み込まれていないようです。認証のためのヘルパー機能としておよびにpw_auth
言及します。valid
これを私のコードに埋め込み、libshadow.a
シャドウツールに接続しようとしましたが、pw_auth
「未解決の外部参照」エラーが発生しますvalid
。コードは次のとおりです。
if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
&& pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
|| !valid (passwd, pw)) {
return (UPAP_AUTHNAK);
}
これを詳しく調べていませんが、Shadow-utilsが更新されるたびにコードを更新する必要があるため、とにかく好ましい解決策ではありません。
むしろ、あなたをターゲットとするプロバイダに接続したいと思います/etc/shadow
。まだ見つからないものはありますか?それとも別のソリューション?
答え1
私の考えでは、Shadow-utilsのアップデートに対するあなたの恐れは根拠がありません。このHOWTOで説明されているルーチンは、特別なものをインストールせずにUbuntu 12.04およびMint 17システムで動作します。
/etc/shadow
Cプログラムから情報を読み取る構造は、およびにあります。/usr/include/shadow.h
たとえば、man 5 shadow
シャドウパスワードエントリを名前で定義する関数を見つける必要があります。/usr/include/shadow.h
これにより、その内容とすべての関連機能を説明するgetspnam
マニュアルページ()も提供されます。man getspnam
。
これに基づいて、特定の名前に対してハッシュされたパスワードエントリを取得できる必要があります。ハッシュされたパスワードには複数の「$」トークンが含まれている必要があり、ハッシュされたパスワードから最後の「$」を含む最後の「$」以降のすべてのエントリを削除してソルトとして提供する必要があります。crypt()
glibcのバージョン(バージョンによって異なりますman 3 crypt
)は処理可能でなければなりません。 「拡張」ソルトは、今日より一般的なSHA512エントリを表します。