GNU/Linux >> Linux の 問題 >  >> Linux

Linuxでパスワードを確認するには?

暗号化されたパスワードは awk で簡単に抽出できます。次に、プレフィックス $algorithm$salt$ を抽出する必要があります (このシステムは従来の DES を使用していないと仮定します。これは、最近では力ずくで実行される可能性があるため、強く推奨されていません)。

correct=$(</etc/shadow awk -v user=bob -F : 'user == $1 {print $2}')
prefix=${correct%"${correct#\$*\$*\$}"}

パスワード チェックの場合、基になる C 関数は crypt です。 、しかしそれにアクセスするための標準的なシェル コマンドはありません。

コマンドラインでは、Perl ワンライナーを使用して crypt を呼び出すことができます

supplied=$(echo "$password" |
           perl -e '$_ = <STDIN>; chomp; print crypt($_, $ARGV[0])' "$prefix")
if [ "$supplied" = "$correct" ]; then …

これは純粋なシェル ツールでは実行できないため、Perl を使用できる場合は、すべて Perl で実行することもできます。 (または Python、Ruby、... crypt を呼び出すことができる利用可能なものは何でも 関数) 警告、テストされていないコード。

#!/usr/bin/env perl
use warnings;
use strict;
my @pwent = getpwnam($ARGV[0]);
if ([email protected]) {die "Invalid username: $ARGV[0]\n";}
my $supplied = <STDIN>;
chomp($supplied);
if (crypt($supplied, $pwent[1]) eq $pwent[1]) {
    exit(0);
} else {
    print STDERR "Invalid password for $ARGV[0]\n";
    exit(1);
}

Perl を使用しない組み込みシステムでは、小さな専用の C プログラムを使用します。警告、ブラウザーに直接入力しましたが、コンパイルも試みていません。これは必要な手順を説明するためのものであり、堅牢な実装ではありません!

/* Usage: echo password | check_password username */
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <shadow.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
    char password[100];
    struct spwd shadow_entry;
    char *p, *correct, *supplied, *salt;
    if (argc < 2) return 2;
    /* Read the password from stdin */
    p = fgets(password, sizeof(password), stdin);
    if (p == NULL) return 2;
    *p = 0;
    /* Read the correct hash from the shadow entry */
    shadow_entry = getspnam(username);
    if (shadow_entry == NULL) return 1;
    correct = shadow_entry->sp_pwdp;
    /* Extract the salt. Remember to free the memory. */
    salt = strdup(correct);
    if (salt == NULL) return 2;
    p = strchr(salt + 1, '$');
    if (p == NULL) return 2;
    p = strchr(p + 1, '$');
    if (p == NULL) return 2;
    p[1] = 0;
    /*Encrypt the supplied password with the salt and compare the results*/
    supplied = crypt(password, salt);
    if (supplied == NULL) return 2;
    return !!strcmp(supplied, correct);
}

別のアプローチは、 su などの既存のプログラムを使用することです または login .実際、可能であれば、Web アプリケーションが su -c somecommand username を介して必要なものを実行できるように調整するのが理想的です。 .ここで難しいのは、パスワードを su にフィードすることです;これには端末が必要です。端末をエミュレートする通常のツールは expect ですが、組み込みシステムにとっては大きな依存関係があります。また、 su の間 は BusyBox にありますが、多くの場合、BusyBox バイナリを root に設定する必要があるため、省略されることがよくあります。それでも、それが可能であれば、これはセキュリティの観点から最も堅牢なアプローチです。


man 5 shadow を見てください および man 3 crypt .後者から、パスワードが /etc/shadow でハッシュされていることがわかります。 次の形式があります:

 $id$salt$encrypted

どこで id 暗号化のタイプを定義し、さらに読むと、

のいずれかになります。
          ID  | Method
          ---------------------------------------------------------
          1   | MD5
          2a  | Blowfish (not in mainline glibc; added in some
              | Linux distributions)
          5   | SHA-256 (since glibc 2.7)
          6   | SHA-512 (since glibc 2.7)

ハッシュの種類に応じて、適切な関数/ツールを使用して、パスワードを「手動で」生成および検証する必要があります。システムに mkpasswd が含まれている場合 ここで提案されているように使用できます。 (あなたはを取ります 明らかでない場合は、shadow ファイルから。) たとえば、md5 の場合 パスワード:

 mkpasswd -5 <the_salt> <the_password>

/etc/shadow に一致する文字列を生成します


Stack Overflow で同様の質問がありました。 CluelessCoder は、組み込みシステムにある場合とない場合がある、expect を使用してスクリプトを提供しました。

#!/bin/bash
#
# login.sh $USERNAME $PASSWORD

#this script doesn't work if it is run as root, since then we don't have to specify a pw for 'su'
if [ $(id -u) -eq 0 ]; then
        echo "This script can't be run as root." 1>&2
        exit 1
fi

if [ ! $# -eq 2 ]; then
        echo "Wrong Number of Arguments (expected 2, got $#)" 1>&2
        exit 1
fi

USERNAME=$1
PASSWORD=$2

#since we use expect inside a bash-script, we have to escape tcl-$.
expect << EOF
spawn su $USERNAME -c "exit" 
expect "Password:"
send "$PASSWORD\r"
#expect eof

set wait_result  [wait]

# check if it is an OS error or a return code from our command
#   index 2 should be -1 for OS erro, 0 for command return code
if {[lindex \$wait_result 2] == 0} {
        exit [lindex \$wait_result 3]
} 
else {
        exit 1 
}
EOF

Linux
  1. Linuxでタイムゾーンを確認する方法

  2. Linuxのログイン履歴を確認する方法

  3. Linux で空のパスワードで ssh を許可する方法

  1. Redhatのバージョンを確認する方法

  2. Linuxでアカウントのパスワードを管理する方法

  3. NIS を使用して Linux でパスワード エージングを有効にする方法

  1. LinuxでWindowsパスワードをリセットする方法

  2. Linuxでディスク容量を確認する方法

  3. KaliLinuxのバージョンを確認する方法