【问题标题】:return original value of sha256 [duplicate]返回sha256的原始值[重复]
【发布时间】:2021-10-22 09:34:43
【问题描述】:

我的数据库中有一个名为 user 的表,我将密码保存在 sha256 中。我想知道我现在是否可以从 sha256 获取原始值,以将其显示在用户配置文件前端上。
示例

use sha2::{Digest, Sha256};

fn test() {
    let password = "secret value";
    let password_sh256 = Sha256::digest(password.as_bytes());
    let encrypted_password = format!("{:x}", password_sh256);
    println!("result: {:?}", encrypted_password);
    // result: "c3a57afaa51d985ac0b4117f509e2ce6dd94d520e441778736a945b4cb941755"
}

现在,如何利用名为 encrypted_pa​​ssword 的变量获得名为 password 的变量的原始值?
感谢您的帮助。

【问题讨论】:

  • 说它不能完成有点过分,但是 SHA256 被精确地设计为 not 是可逆的,因此不太可能有一种省时的方法哈希回原来的密码。
  • 你会想要阅读hash functions
  • 好的,我已经明白这将帮助我让用户验证他们的密码,但我无法让用户看到他们自己的密码。现在我认为展示它并不那么重要。
  • 如果某个网站试图在任何地方向我显示我的原始密码,我可能会因为害怕而立即停止使用该网站,所以这似乎是一个不错的选择 :)
  • 这能回答你的问题吗? How to decrypt a SHA-256 encrypted string?

标签: rust


【解决方案1】:

SHA-256 被设计为在计算上不可行(简单来说:几乎不可能)像您想要的那样进行反转。事实上,可以证明存在多个输入哈希到相同值的情况(尽管目前在计算上也无法找到它们),所以充其量,您可以找到 some 输入散列到相同的值。但是,如前所述,目前任何人都不太可能这样做。

此外,还有一些事情要提一下。首先,您永远不应该向用户显示他们的明文密码。您不知道用户是否在咖啡店、图书馆或其他公共场所,其他人可能会在这里冲浪,因此您不想暴露这一点。此外,出于安全原因,您不希望能够反转密码(因为这意味着其他任何人都可以),因此无法实际显示它。

此外,您不想使用普通的 SHA-256 进行密码散列。原因是如果人们选择了错误的密码,比如“password123”,那么所有使用错误密码的用户都将拥有相同的密码哈希值,而且还很容易制作一个已知被泄露的密码的巨大列表并查看它们在列表中。您想要做的是使用像 Argon2 或 bcrypt 这样的密码散列函数,它 (a) 对每个密码使用唯一的盐(随机数据),并且 (b) 多次迭代操作,因此它很慢并且猜测许多密码需要很长时间时间。幸运的是,Rust 中有一些库可以做到这一点,the argon2 crate has great documentation explaining how to do just this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多