add first commit
CI / linux (map[runner:ubuntu-22.04 target:aarch64]) (push) Has been cancelled
CI / linux (map[runner:ubuntu-22.04 target:armv7]) (push) Has been cancelled
CI / linux (map[runner:ubuntu-22.04 target:ppc64le]) (push) Has been cancelled
CI / linux (map[runner:ubuntu-22.04 target:s390x]) (push) Has been cancelled
CI / linux (map[runner:ubuntu-22.04 target:x86]) (push) Has been cancelled
CI / linux (map[runner:ubuntu-22.04 target:x86_64]) (push) Has been cancelled
CI / musllinux (map[runner:ubuntu-22.04 target:aarch64]) (push) Has been cancelled
CI / musllinux (map[runner:ubuntu-22.04 target:armv7]) (push) Has been cancelled
CI / musllinux (map[runner:ubuntu-22.04 target:x86]) (push) Has been cancelled
CI / musllinux (map[runner:ubuntu-22.04 target:x86_64]) (push) Has been cancelled
CI / windows (map[python_arch:arm64 runner:windows-11-arm target:aarch64]) (push) Has been cancelled
CI / windows (map[python_arch:x64 runner:windows-latest target:x64]) (push) Has been cancelled
CI / windows (map[python_arch:x86 runner:windows-latest target:x86]) (push) Has been cancelled
CI / macos (map[runner:macos-15-intel target:x86_64]) (push) Has been cancelled
CI / macos (map[runner:macos-latest target:aarch64]) (push) Has been cancelled
CI / sdist (push) Has been cancelled
CI / Release (push) Has been cancelled

This commit is contained in:
2026-07-23 10:55:34 +08:00
commit 589a56765f
7 changed files with 625 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
use argon2::{
password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
Argon2,
};
use pyo3::exceptions::PyValueError;
use pyo3::prelude::*;
/// 对明文密码进行 Argon2id 哈希,返回 PHC 格式的字符串。
/// 示例输出: "$argon2id$v=19$m=19456,t=2,p=1$c2FsdHlzYWx0$..."
#[pyfunction]
fn hash_password(password: &str) -> PyResult<String> {
let salt = SaltString::generate(&mut OsRng);
let argon2 = Argon2::default(); // 使用 Argon2id 默认参数 (m=19456, t=2, p=1)
let password_hash = argon2
.hash_password(password.as_bytes(), &salt)
.map_err(|e| PyValueError::new_err(format!("哈希失败: {}", e)))?;
Ok(password_hash.to_string())
}
/// 验证明文密码是否与给定的 PHC 格式哈希匹配。
#[pyfunction]
fn verify_password(password: &str, password_hash: &str) -> PyResult<bool> {
let parsed_hash = PasswordHash::new(password_hash)
.map_err(|e| PyValueError::new_err(format!("无效的哈希格式: {}", e)))?;
let argon2 = Argon2::default();
Ok(argon2
.verify_password(password.as_bytes(), &parsed_hash)
.is_ok())
}
/// 模块初始化,注册上述函数。
#[pymodule]
fn chongming_password(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_function(wrap_pyfunction!(hash_password, m)?)?;
m.add_function(wrap_pyfunction!(verify_password, m)?)?;
Ok(())
}