发布我的密码哈希是否安全?

信息安全 密码 哈希 云储存
2021-08-27 08:37:27

发布我的密码哈希会有多不安全?

我编写了一个 Python 脚本来帮助我记住我的基本密码(计算机密码、加密备份密码、AppleID 密码和 KeyChain 密码)。

它在里面是硬编码的:

SHA256(MD5(password) + password + MD5(password))

对于每个密码,我都会定期运行它以保持记忆新鲜。

我在 GitLab 上有一个私人仓库,我在其中存储所有通用文件,我想提交这个脚本。我看不出这样做有什么问题,因为据我所知,恢复原始密码是不可能的,但我更愿意请教专家,以确保。

编辑: 我正在添加我的脚本的匿名版本,因此您可以了解它是如何工作的:

from hashlib import md5, sha256
from getpass import getpass
from random import choice

def hash(pwd):
    pwd = pwd.encode()
    return sha256((md5(pwd).hexdigest()+str(pwd)+md5(pwd).hexdigest()).encode()).hexdigest()


dict = {'pass1': '6eaa49070c467d1edead2f6bc54cf42cdda11ae60d40aef2624a725871d3f452',
        'pass2': '240cbc4ba2661b333f9ad9ebec5969ca0b5cf7962a2f18a45c083acfd85dd062',
        'pass3': 'b018ed7bff94dbb0ed23e266a3c6ca9d1a1739737db49ec48ea1980b9db0ad46',
        'pass3': '7dd3a494aa6d5aa0759fc8ea0cd91711551c3e8d5fb5431a29cfce26ca4a2682'
       }

while True:
    tipologia, hash_result = choice(list(dict.items()))
    while True:
        pwd = getpass(f'Password {tipologia}: ')
        if hash(pwd) == hash_result:
            print('Correct!')
            break
        else:
            print('Wrong!')
4个回答

MD5 和 SHA256 都被设计为尽可能快。他们的目的是为相对较大的数据量(例如文件)计算哈希值。这就是为什么它们非常快,这使得暴力破解更容易。

单个 GPU 每秒可以生成 ~10^10 SHA256 哈希值。每天约为 10^15。MD5 的计算速度要快得多,在某些 GPU 上快约 5 倍。所以让我们忽略算法中的 MD5 部分,只考虑 SHA256。

假设您有一个由 10 个字母数字字符组成的密码,即来自 62 个字符集。不同密码的数量为 62^10 ~= 10^18。这意味着,要暴力破解这样的密码,攻击者需要 10^18 / 10^15 = 1000 天(使用单个 GPU)或 100 天(使用 10 个 GPU)或 10 天(使用 100 个 GPU)。因此,能够负担 10 个 GPU 的攻击者将在 100 天内破解此类密码。

如果您使用 16 个字符的密码,即长 6 个字符,则所需的计算能力需要高 62^6 = 5*10^10。

因此,安全性基本上取决于您的密码有多长。

另一个重要因素是暴力破解的成本和攻击者可能获得的好处。例如,如果暴力破解您的密码将花费攻击者 900 000 美元,而知道您的密码会给攻击者带来 1 000 000 美元的收益,那么总共将带来 100 000 美元的收益,并且暴力破解是有道理的。但是如果密码只能访问一个银行账户,比如说 10 000 美元,那么攻击者将损失 890 000 美元。在这种情况下,暴力破解对攻击者来说毫无意义。只有您可以决定是否有人愿意为暴力破解您的密码所需的计算能力支付很多钱。

使用设计为慢的散列算法是有意义的,例如 Argon2 或 Lyra2。它们具有可调参数。使用单个哈希值需要 0.1 - 1 秒的值。因此,您可以从根本上减缓暴力破解并进一步降低风险。

这种方法有几个问题。

首先,您使用两个普通的加密散列函数来散列您的数据。密码散列函数本身被设计为快速。这意味着攻击者很容易尝试暴力破解您的密码。唯一安全使用普通密码散列函数对秘密进行散列的情况是,该秘密是 CSPRNG 的足够长的输出(即,它具有至少 128 位的熵)。为了将此密码安全地存储在系统上,您应该使用密码散列函数,如系统上的加密函数之一,scrypt 或 Argon2,它们被设计为可迭代且昂贵的以防止暴力破解。

其次,你没有这个密码的盐。结果,任何人都可以散列在任何违规行为中发现的大型密码列表的输出,并使用此方案创建一个巨大的密码表。如果您使用的是安全密码散列系统,则需要相当长的盐来随机化密码并防止生成所谓的彩虹表来进行简单的表查找。

第三,您正在使用 MD5,它不应该再用于任何事情。17 年来,MD5 一直被认为是完全不安全的,而且完全没有正当理由使用它。 卡内基梅隆大学表示“不适合进一步使用”,责任方不使用。

第四,最好不要公开密码哈希密码被安全地散列,既使猜测变得昂贵,也使得即使散列被暴露也更难猜测,但是如果有人以某种方式获得了您的散列密码并且它是可猜测的,那么他们将能够通过足够的努力来猜测它。因此,您的密码必须相当安全并包含足够的熵,即使散列被暴露,在计算上也无法猜测。它也不需要重复使用,因为如果它曾经暴露在其他地方,那么你必须假设攻击者知道它(因为通常,他们可以找到它)然后它就变成了一个容易猜测的单词列表中的另一个条目。

都有很好的答案。我将尝试解决直接的问题。

发布我的密码哈希会有多不安全?

很不安全。无论使用何种算法,请永远不要在开放网络上分享密码或其哈希值。为什么:

  1. 这是一个不好的做法。一个坏习惯。你在鼓励自己和周围的人降低警惕。
  2. 加密(及其黑客)非常复杂。世界上很少有人能明确地说出你所做的事情是否真的安全。但是有一大群人不会说什么,默默地微笑,让你犯错误并误导人们。这些不仅仅是黑客,他们也是国家行为者和情报机构,他们有真正的动机让普通民众降低对隐私的警惕。您的 AppleID 密码可能对任何人都没有多大意义,但在空气中传播的一点点坏习惯对他们来说是值得的。
  3. 现在安全(或无辜)的东西在未来可能不一样了。谁知道15年后你会在哪里找到自己。互联网永远不会忘记。你的过去可能会困扰着你。或者它可能不会——它都可能继续是无辜的。为什么要碰运气?

我编写了一个 Python 脚本来帮助我记住我的基本密码(计算机密码、加密备份密码、AppleID 密码和 KeyChain 密码)。它在里面是硬编码的:SHA256(MD5(password) + password + MD5(password))

请永远不要创建自己的加密算法。请参阅第 2 点了解原因。其他人试图回答为什么这个特定算法存在缺陷的确切技术原因。最好提醒自己,不仅是这个算法,而且我们自己提出的任何算法都有缺陷。在加密世界中,最安全的路径是人迹罕至的路径。没有例外。

我在 GitLab 上有一个私人仓库,我在其中存储所有通用文件,我想提交这个脚本。

提交代码很好,提交哈希不是。

我看不出这样做有什么问题,因为据我所知,恢复原始密码是不可能的,但我更愿意请教专家,以确保。

谢谢你的提问。:)impossible是一个非常强烈的词,任何专家都不会在其不受约束的意义上使用它。即使像谷歌这样的公司(例如)他们的密码被极大地散列到了真正无法恢复的地步,你仍然看不到他们发布散列。基本上,请坚持“秘密”的东西,就好像它们真的是秘密一样。散列或油炸不会降低数据的敏感性。散列只是一种防御。不是绝对的。

所以,请

  1. 不要发明自己的加密算法。
  2. 不要在源代码中硬编码散列/密码/键。
  3. 绝对不要在源代码管理中提交/推送。
  4. 不要发布哈希。

早在安全气囊是昂贵汽车的昂贵选择的那一天,我曾经和一位拥有带安全气囊的 BMW-635 的同事一起骑车。他相信他不需要系安全带,因为安全气囊会救他。没有人再相信这一点了。两种安全机制都是必要的,具有互补的目的

密码过去以纯文本形式存储。然后我们开始对它们进行哈希处理。然后黑客开始构建彩虹表,所以我们开始给它们加盐。现在黑客正在窃取密码哈希文件并进行暴力破解,因此我们停止使用 MD5 和 SHA1,并实施 2048 轮哈希以减缓暴力攻击。太慢了,我们正在切换到密码的慢散列算法,以进一步减慢暴力攻击

尽管如此,黑客仍在窃取哈希文件,而且他们仍然是暴力破解。10% 到 15% 的密码在 24 小时的暴力破解中是可以猜到的,因为很少有人理解“长而随机”。在其他地方,我建议使用 7 字 Diceware 密码,但没有人回应,即使是“请解释”。现在,这 10%-15% 的密码是从一个散列文件中破解的,该散列文件是从一些微不足道的仅限会员的封闭论坛中被盗或泄露的。但是这些用户中有 30%-40% 在更重要的登录(gmail、applemail、msmail)上使用相同的用户名和密码,并且他们将这些电子邮件帐户用于银行业务

关键是,不要做不系安全带的人

使用长而随机的密码,并且永远不要暴露哈希值