面试题答案
一键面试安全存储和传输处理措施
加密算法选择
- 存储:对于存储密码,应使用密码哈希函数,如Argon2、bcrypt或scrypt。这些函数设计用于抵御暴力破解和彩虹表攻击。以Argon2为例,它在2015年被选为密码哈希竞赛的获胜者,其设计考虑了内存硬度、并行化和自适应等特性,使得计算哈希值成本较高,增加破解难度。
- 传输:在传输敏感数据时,使用TLS(Transport Layer Security)协议。现代Web服务器通常使用OpenSSL或Rust的
rustls
库来实现TLS。TLS通过对传输数据进行加密,确保数据在网络传输过程中不被窃取或篡改。
防止SQL注入
- 使用参数化查询(Prepared Statements)。在Rust中,与数据库交互时,不同的数据库驱动都提供了参数化查询的方式。例如,对于PostgreSQL数据库,使用
postgres
库;对于MySQL数据库,使用mysql
库等。参数化查询会将用户输入作为参数处理,而不是直接嵌入到SQL语句中,从而防止恶意用户构造恶意SQL语句来获取或修改数据。
Rust代码示例
密码哈希存储
use argon2::{self, Config};
use rand::Rng;
fn hash_password(password: &str) -> String {
let salt: [u8; 16] = {
let mut rng = rand::thread_rng();
let mut salt = [0u8; 16];
rng.fill(&mut salt[..]);
salt
};
let config = Config::default();
let hashed = argon2::hash_encoded(password.as_bytes(), &salt, &config).expect("Failed to hash password");
hashed
}
fn verify_password(hashed: &str, password: &str) -> bool {
argon2::verify_encoded(hashed, password.as_bytes()).is_ok()
}
防止SQL注入(以PostgreSQL为例)
use postgres::{Client, NoTls};
fn insert_user(username: &str, hashed_password: &str) -> Result<(), postgres::Error> {
let mut client = Client::connect("host=localhost user=your_user password=your_password dbname=your_dbname", NoTls)?;
client.execute("INSERT INTO users (username, hashed_password) VALUES ($1, $2)", &[&username, &hashed_password])?;
Ok(())
}
在上述代码中,hash_password
函数用于对密码进行哈希处理,verify_password
函数用于验证密码。而insert_user
函数展示了如何使用PostgreSQL的参数化查询来插入用户数据,从而防止SQL注入。