如果已知salt和密码哈希,则强制执行crypt()?

如果已知salt和密码哈希,则强制执行crypt()?,c,linux,password-encryption,brute-force,crypt,C,Linux,Password Encryption,Brute Force,Crypt,在玩一些战争游戏时,我很好奇这是否可能(他们可能希望你用不同的方式解决它,但仍然如此) 有一个.c文件,其函数的代码如下所示: char buffer[20]; scanf("%s", buffer); char* hash = crypt(buffer, "$6$") char* password = "$6$123456abcdef" #long string if (strcmp(password, hash) == 0) supersecretfunction(); 考虑到salt和

在玩一些战争游戏时,我很好奇这是否可能(他们可能希望你用不同的方式解决它,但仍然如此)

有一个
.c
文件,其函数的代码如下所示:

char buffer[20];
scanf("%s", buffer);
char* hash = crypt(buffer, "$6$")
char* password = "$6$123456abcdef" #long string 
if (strcmp(password, hash) == 0) supersecretfunction();

考虑到salt和hash密码已经为人所知,有没有一种方法可以强制执行此操作?

与旧Unix变体中使用的原始基于DES的crypt()算法不同,旧Unix变体可能会使用相对较少的现代资源强制执行,包括大多数GNU/Linux版本在内的新Unix使用扩展的加密密码规范。如果加密密码(或salt)以“$id$”开头,其中“id”是一个算法标识符,则可以识别这一点,请参见下表

“$6$”表示SHA-512用于加密(实际上是散列)。在第二个“$”之后是salt,另一个“$”和密码的SHA-512

此处详细描述了所使用的SHA-512算法:

默认情况下,该算法需要5000轮SHA-512加密一个密码。即使是中等长度/复杂度的密码,进行暴力攻击在计算上也是不可行的。基于字典的攻击是可行的,但对于较短、较不复杂的密码来说仍然很耗时

有关密码字段的格式,请参阅上面的链接文章或摘要,请参阅以下部分中引用的内容:


编辑:本文可能也很有趣:

与旧Unix变体中使用的原始基于DES的crypt()算法不同,旧Unix变体可能会使用相对有限的现代资源强制使用,新的Unice(包括大多数GNU/Linux版本)使用扩展的加密密码规范。如果加密密码(或salt)以“$id$”开头,其中“id”是一个算法标识符,则可以识别这一点,请参见下表

“$6$”表示SHA-512用于加密(实际上是散列)。在第二个“$”之后是salt,另一个“$”和密码的SHA-512

此处详细描述了所使用的SHA-512算法:

默认情况下,该算法需要5000轮SHA-512加密一个密码。即使是中等长度/复杂度的密码,进行暴力攻击在计算上也是不可行的。基于字典的攻击是可行的,但对于较短、较不复杂的密码来说仍然很耗时

有关密码字段的格式,请参阅上面的链接文章或摘要,请参阅以下部分中引用的内容:


编辑:这篇文章可能也很有趣:

取决于加密。要使用暴力,您需要能够将加密的纯文本与密文进行比较(也就是说,你需要能够复制整个加密方法。既然你有这个函数,而且你知道salt,我想说你能够。这一切都归结于加密的密钥长度。现代加密方法在计算上很难在蛮力下使用。因此,找出你需要检查一个密码的可能密码数看需要多长时间。取决于加密。要使用暴力,你需要能够将加密的纯文本与密文进行比较(也就是说,你需要能够复制整个加密方法。既然你有这个函数,而且你知道salt,我想说你能够。这一切都归结于加密的密钥长度。现代加密方法在计算上很难在蛮力下使用。因此,找出你需要检查一个密码的可能密码数我看看要花多长时间。
   If salt is a character string starting with the characters "$id$"
   followed by a string terminated by "$":

          $id$salt$encrypted

   then instead of using the DES machine, id identifies the encryption
   method used and this then determines how the rest of the password
   string is interpreted.  The following values of id are supported:

          ID  | Method
          ─────────────────────────────────────────────────────────
          1   | MD5
          2a  | Blowfish (not in mainline glibc; added in some
              | Linux distributions)
          5   | SHA-256 (since glibc 2.7)
          6   | SHA-512 (since glibc 2.7)

   So $5$salt$encrypted is an SHA-256 encoded password and
   $6$salt$encrypted is an SHA-512 encoded one.

   "salt" stands for the up to 16 characters following "$id$" in the
   salt.  The encrypted part of the password string is the actual
   computed password.  The size of this string is fixed:

   MD5     | 22 characters
   SHA-256 | 43 characters
   SHA-512 | 86 characters

   The characters in "salt" and "encrypted" are drawn from the set
   [a-zA-Z0-9./].  In the MD5 and SHA implementations the entire key is
   significant (instead of only the first 8 bytes in DES).