Rust:如何散列一个字符串?

Posted

技术标签:

【中文标题】Rust:如何散列一个字符串?【英文标题】:Rust: How to hash a string? 【发布时间】:2022-01-16 00:55:31 【问题描述】:

我正在尝试在 Rust 中创建一个控制台应用程序,您必须在其中输入密码才能访问文件的其余部分,所以我想确保您不能只读取文件来找到密码,所以我想将密码存储为哈希,因此它(不可能)不可逆转。

我在 Rust 中查找了散列,但它们似乎只能用于结构,而我正在尝试插入一个字符串。结构是能够做到这一点的唯一方法吗?

【问题讨论】:

docs.rs/password-hash/0.1.1/password_hash 所以它(可能)是不可逆转的?没有? @PresidentJamesK.Polk 你链接到了旧版本的货物,而这批货物的文档令人困惑,只列出了几乎没有解释的功能。 @Stargateur 我的意思是有人不可能像哈希一样反转文件中的密码。 听起来您使用了错误的工具。什么会阻止用户在另一个不检查该哈希的程序中打开文件并访问所有内容?听起来您需要加密,而不是密码验证。 【参考方案1】:

Rust 中内置的 Hash 类旨在处理数据以进入 HashMap 或 HashSet。这不适合密码验证。

如果你想执行密码验证,你应该使用像 Argon2id 或 scrypt 这样的密码哈希。您可以在 argon2scrypt 板条箱中找到这些。密码哈希总是占用字节,因此您需要以&[u8] 的形式访问您的字符串。 password_hash crate 提供了可以用来将这些特征转换为序列化密码的特征。

如果您的目标是使用密码加密文件的其余部分,那么您应该使用与 NaCl 的绑定之一。该库具有旨在确保安全的原语。您将使用密码散列功能和随机盐来生成密钥,然后将其用作具有随机随机数的秘密框的密钥输入。还有其他方法可以做到这一点,但除非您精通密码学,否则使用 NaCl 是一个明智的选择,因为它更难被滥用。

【讨论】:

不幸的是,我现在不能这样做,因为这里是凌晨 3 点。我明天会检查一下,如果它有效,我会批准:)

以上是关于Rust:如何散列一个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 web_sys 从 Rust 创建一个 JS 字符串数组?

如何在 Rust 中将字符串拆分为块以插入空格

如何解析八进制字符串作为Rust中的浮点数?

如何使用字符串作为参数从 Go 调用 Rust 函数?

如何在每一轮中多次散列并连接一个字符串

如何从 NodeJS 中的 Rust FFI 函数返回字符串值?