#kerberos #ntlm #windows

sspi

A Rust实现的安全支持提供接口(SSPI)API

21个版本 (12个重大更改)

0.13.0 2024年8月5日
0.12.0 2024年3月18日
0.11.1 2023年12月14日
0.11.0 2023年11月16日
0.2.0 2019年7月18日

#13 in 身份验证

Download history 2269/week @ 2024-05-04 2768/week @ 2024-05-11 2885/week @ 2024-05-18 2181/week @ 2024-05-25 2966/week @ 2024-06-01 3583/week @ 2024-06-08 3157/week @ 2024-06-15 3082/week @ 2024-06-22 1971/week @ 2024-06-29 2204/week @ 2024-07-06 2170/week @ 2024-07-13 2049/week @ 2024-07-20 2746/week @ 2024-07-27 2266/week @ 2024-08-03 2211/week @ 2024-08-10 2424/week @ 2024-08-17

每月10,126次下载
用于 ldap3_proto

MIT/Apache

1MB
17K SLoC

sspi-rs

sspi-rs安全支持提供接口(SSPI) 的 Rust 实现。它包含平台无关的安全支持提供者(SSP)实现,并在 Windows 上运行时能够使用原生 Microsoft 库。

sspi-rs 的目的是清理原始接口的杂乱,并为用户提供在 *nix 或任何其他能编译 Rust 的平台上执行的用户友好的 SSP。

概述

sspi-rs 与 MSDN 文档一致。目前实现了 NT LAN Manager (NTLM) 并可进行平台无关执行。您也可以通过实现 SspiImpl 特性来创建自己的 SSP。更多内容请参阅 文档

易用性

一些 SSPI 函数可能会有些繁琐,因此 sspi-rs 允许通过使用构建器以方便的方式使用 SSPI。示例可在 示例示例部分文档 中找到。

文档

文档将为您提供对 crate 的全面概述。对于简单用例的示例,请访问 示例 文件夹。

示例

使用 SSP 的方法就像创建安全提供者实例并调用其函数一样简单。

以下是获取凭证句柄及其有效时间戳的示例

use sspi::{CredentialUse, Ntlm, Sspi, Username, builders::EmptyInitializeSecurityContext, OwnedSecurityBuffer, ClientRequestFlags, DataRepresentation, SecurityBufferType, SspiImpl};

fn main() {
    let account_name = "example_user";
    let computer_name = "example_computer";
    let mut ntlm = Ntlm::new();
    let username = Username::new(&account_name, Some(&computer_name)).unwrap();
    let identity = sspi::AuthIdentity {
        username,
        password: String::from("example_password").into(),
    };

    let mut acq_cred_result = ntlm
        .acquire_credentials_handle()
        .with_credential_use(CredentialUse::Outbound)
        .with_auth_data(&identity)
        .execute()
        .unwrap();

    let mut output_buffer = vec![OwnedSecurityBuffer::new(Vec::new(), SecurityBufferType::Token)];
    // first time calling initialize_security_context, the input buffer should be empty
    let mut input_buffer = vec![OwnedSecurityBuffer::new(Vec::new(), SecurityBufferType::Token)];

    // create a builder for the first call to initialize_security_context
    // the target should start with the protocol name, e.g. "HTTP/example.com" or "LDAP/example.com"
    let mut builder = EmptyInitializeSecurityContext::<<Ntlm as SspiImpl>::CredentialsHandle>::new()
        .with_credentials_handle(&mut acq_cred_result.credentials_handle)
        .with_context_requirements(ClientRequestFlags::CONFIDENTIALITY | ClientRequestFlags::ALLOCATE_MEMORY)
        .with_target_data_representation(DataRepresentation::Native)
        .with_target_name("LDAP/example.com")
        .with_input(&mut input_buffer)
        .with_output(&mut output_buffer);

    // call initialize_security_context
    // Note: the initialize_security_context_impl returns a generator, for NTLM, 
    // this generator will never yield as NTLM requires no network communication to a third party
    // but negotiate and kerberos do require network communication, so the generator is used to
    // allow the caller to provide the network information through the generator.resume() method
    // take a look at the examples/kerberos.rs for more information
    let _result = ntlm
        .initialize_security_context_impl(&mut builder)
        .resolve_to_result()
        .unwrap();
    // ... exchange your token in output buffer with the server and repeat the process until either server is satisfied or an error is thrown
}

获取由 Windows 提供的 SSP 的示例

let mut negotiate = SecurityPackage::from_package_type(
    SecurityPackageType::Other(String::from("Negotiate"))
);

使用 sspi-rs 的项目

(如果您知道其他项目,请随时提交 PR!)

许可证

许可协议为以下之一

任选其一。

贡献

除非您明确说明,否则您根据 Apache-2.0 许可协议定义提交的任何有意包含在作品中的贡献,将按照上述协议双重许可,不附加任何额外条款或条件。

依赖项

~14–61MB
~1M SLoC