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 身份验证
每月10,126次下载
用于 ldap3_proto
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