#password #user-name #security #validate #macos #account #linux-macos

pwcheck

为Linux、MacOS和Windows提供验证用户名和密码的功能

3个不稳定版本

0.2.1 2023年5月18日
0.2.0 2023年5月18日
0.1.0 2023年5月18日

#549 in 身份验证

MIT/Apache

29KB
302

pwcheck

Crates.io Docs.rs CI RustC 1.64+

为Linux、MacOS和Windows提供一个单独的函数来检查和验证本地用户账户的密码。

由于https://github.com/1wilkens/pam/issues/25,目前不支持在Linux上使用musl。将会导致SIGSEGV!

安装

[dependencies]
pwcheck = "0.2"

依赖项

  • Linux上,此库利用PAM绑定,因此需要PAM开发者头文件。
    • Debian/Ubuntu: apt install libpam0g-dev
    • Fedora/CentOS: dnf install pam-devel(如果您遇到“stddef.h not found”,您可能还需要dnf install clang
  • MacOS上,此库利用dscl,不需要额外的任何东西。
  • Windows上,此库利用windows-rs,不需要额外的任何东西。

用法

use pwcheck::*;

fn main() {
    // Check if some username/password combo is valid
    match pwcheck("username", "password") {
        PwcheckResult::Ok => println!("Correct username & password!"),
        PwcheckResult::WrongPassword => println!("Incorrect username & password!"),
        PwcheckResult::Err(x) => println!("Encountered error: {x}"),
    }
}

工作原理

Linux

在Linux平台上,此库利用PAM与登录服务以非交互式方式通过用户名和密码执行身份验证。

您可以使用Linux模块的实现指定不同的服务

use pwcheck::PwcheckResult;

fn main() {
    #[cfg(target_os = "linux")]
    {
        use pwcheck::linux::{Method, pwcheck};
        match pwcheck(Method::Pam {
            username: "username",
            password: "password",
            service: "my-service",
        }) {
            PwcheckResult::Ok => println!("Correct username & password!"),
            PwcheckResult::WrongPassword => println!("Incorrect username & password!"),
            PwcheckResult::Err(x) => println!("Encountered error: {x}"),
        }
    }
}

请注意,PAM身份验证仅适用于用户名和密码,如果以下任一条件成立:

a. 用户名与执行身份验证的用户匹配 b. 执行身份验证的用户具有提升的权限

换句话说,普通用户不能验证其他用户的用户名和密码。这将返回一个关于密码错误的错误。

MacOS

在MacOS平台上,此库利用执行dscl来使用本地目录的数据源 "." (.) 验证用户。

您可以使用MacOS模块的实现指定不同的数据源

use pwcheck::PwcheckResult;

fn main() {
    #[cfg(target_os = "macos")]
    {
        use pwcheck::macos::{Method, pwcheck};
        match pwcheck::macos::pwcheck(Method::Dscl {
            username: "username", 
            password: "password", 
            datasource: "/Login/Default", 
            timeout: None,
        }) {
            PwcheckResult::Ok => println!("Correct username & password!"),
            PwcheckResult::WrongPassword => println!("Incorrect username & password!"),
            PwcheckResult::Err(x) => println!("Encountered error: {x}"),
        }
    }
}

Windows

在Windows平台上,此库利用LogonUserW函数尝试将用户登录到本地计算机。

您可以直接执行以下Windows模块实现:

use pwcheck::PwcheckResult;

fn main() {
    #[cfg(windows)]
    {
        use pwcheck::windows::{Method, pwcheck};
        match pwcheck::windows::pwcheck(Method::LogonUserW {
            username: "username", 
            password: "password", 
        }) {
            PwcheckResult::Ok => println!("Correct username & password!"),
            PwcheckResult::WrongPassword => println!("Incorrect username & password!"),
            PwcheckResult::Err(x) => println!("Encountered error: {x}"),
        }
    }
}

请注意,此功能要求运行程序具有设置在SeTcbPrivilege 权限,以便以除启动程序的用户以外的用户身份登录。因此,可以安全地使用此功能来验证运行此程序的用户账户,但否则需要非常高级的权限来验证密码,通常是运行程序时以管理员身份出现时可以看到的权限。

许可证

此项目根据您的选择许可如下:

Apache License, Version 2.0, (LICENSE-APACHE 或 apache-license) MIT 许可证 (LICENSE-MIT 或 mit-license)。

依赖项

~0–38MB
~534K SLoC