如果已知 salt 和密码哈希,则暴力强制 crypt()?
Brute forcing crypt() if salt and password hash are known?
玩过一些兵棋推演,很好奇这是否可行(他们可能希望您以不同的方式解决它,但仍然如此)。
有一个 .c
文件,其函数的代码如下所示:
char buffer[20];
scanf("%s", buffer);
char* hash = crypt(buffer, "$")
char* password = "3456abcdef" #long string
if (strcmp(password, hash) == 0) supersecretfunction();
考虑到 salt 和散列密码已经已知,是否有暴力破解的方法?
与旧 Unix 变体中使用的原始基于 DES 的 crypt() 算法不同,它可能会被相对适度的现代资源强制强制使用,包括大多数 GNU/Linux 风格在内的较新 Unix 使用扩展的加密密码规范。如果加密密码(或盐)以“$id$”开头,您可以识别这一点,其中 "id" 是算法标识符,请参阅下面的 table。
“$6$”表示使用 SHA-512 进行加密(好吧,实际上是散列)。在第二个“$”之后是盐、另一个“$”和密码的 SHA-512。
此处详细描述了所使用的 SHA-512 算法:https://github.com/dchest/historic-password-hashes/blob/master/glibc-sha-crypt.txt
默认情况下,此算法涉及 5000 轮 SHA-512 来加密单个密码。即使是中等 length/complexity 密码,进行暴力攻击在计算上也是不可行的。基于字典的攻击是可行的,但对于较短、不太复杂的密码来说仍然很耗时。
有关密码字段的格式,请参阅上面的链接文章或有关摘要,请参阅 http://man7.org/linux/man-pages/man3/crypt.3.html,部分内容引用如下:
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 $salt$encrypted is an SHA-256 encoded password and
$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).
编辑:本文也可能令人感兴趣:https://www.win.tue.nl/~aeb/linux/hh/hh-4.html
玩过一些兵棋推演,很好奇这是否可行(他们可能希望您以不同的方式解决它,但仍然如此)。
有一个 .c
文件,其函数的代码如下所示:
char buffer[20];
scanf("%s", buffer);
char* hash = crypt(buffer, "$")
char* password = "3456abcdef" #long string
if (strcmp(password, hash) == 0) supersecretfunction();
考虑到 salt 和散列密码已经已知,是否有暴力破解的方法?
与旧 Unix 变体中使用的原始基于 DES 的 crypt() 算法不同,它可能会被相对适度的现代资源强制强制使用,包括大多数 GNU/Linux 风格在内的较新 Unix 使用扩展的加密密码规范。如果加密密码(或盐)以“$id$”开头,您可以识别这一点,其中 "id" 是算法标识符,请参阅下面的 table。
“$6$”表示使用 SHA-512 进行加密(好吧,实际上是散列)。在第二个“$”之后是盐、另一个“$”和密码的 SHA-512。
此处详细描述了所使用的 SHA-512 算法:https://github.com/dchest/historic-password-hashes/blob/master/glibc-sha-crypt.txt
默认情况下,此算法涉及 5000 轮 SHA-512 来加密单个密码。即使是中等 length/complexity 密码,进行暴力攻击在计算上也是不可行的。基于字典的攻击是可行的,但对于较短、不太复杂的密码来说仍然很耗时。
有关密码字段的格式,请参阅上面的链接文章或有关摘要,请参阅 http://man7.org/linux/man-pages/man3/crypt.3.html,部分内容引用如下:
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 $salt$encrypted is an SHA-256 encoded password and $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).
编辑:本文也可能令人感兴趣:https://www.win.tue.nl/~aeb/linux/hh/hh-4.html