PHP的隐藏挑战

时间:2010-09-29 00:20:48

标签: php encryption brute-force

一位朋友给了我一个挑战:他使用PHP的crypt函数(CRYPT_STD_DES)(来自PHP4)加密了一个字符串。我知道用于加密的盐,并且由于crypt是单向算法,我必须使用暴力方法,而且我知道密码只包含小写字母。

现在,我有16核(2x Xeon)和大量RAM的机器。什么是实施此强制攻击的最有效方法(我假设我将不得不使用PHP,这不太好,但如果你们有任何想法......)

[编辑]

我忘了提一下,加密的表示法是13chars长度,字符串少于8个字母,就像一个简单的密码加密:)

3 个答案:

答案 0 :(得分:2)

从PHP手册:

  

crypt()将使用标准Unix返回散列字符串   基于DES的算法或替代方案   可用的算法   系统。

     

某些操作系统支持更多功能   比一种类型的哈希。事实上,   有时基于标准DES   算法被基于MD5的算法取代   算法。哈希类型被触发   通过盐论证。在5.3之前,   PHP将确定可用的   安装时的算法基于   系统的crypt()。如果没有盐   提供,PHP将自动生成   要么是标准的两个字符(DES)   盐,或十二个字符(MD5),   取决于MD5的可用性

换句话说, crypt()函数只是从C库调用操作系统的crypt()函数。这意味着两件事。

首先,加密类型是标准化的。您不需要使用PHP来运行暴力,您只需要知道所使用的算法。像Cane和Abel或者开膛手杰克这样的许多程序都可以通过强力,字典或彩虹表攻击来破解几种算法。

其次,加密类型基于加密的操作系统。这意味着你可能不得不尝试几种不同的加密方法,除非有明显的线索说明使用了哪种方法(加密字符串的模式可能会让你知道某些东西)。

我绝对不会建议尝试使用PHP来强制它,因为解释语言的运行速度比编译的语言快得多。

答案 1 :(得分:2)

这是代码C的快速尝试(使用gcc -O2 -lcrypt编译)
在Ubuntu 10.04.1上

  #define _XOPEN_SOURCE
  #include <unistd.h>
  #include <stdio.h>
  #include <stdlib.h>

  void inc(char *p)
  {
     int i;
     for (i=0 ; i<8 && p[i]=='z' ; i++);
     if (i >= 8) exit(printf("Not found :-(\n"));
     if (!p[i]) p[i]='a';
     else p[i]++;
     while (--i >= 0) p[i]='a';
  }

  int main ()
  {
    char *salt = "XY";
    char *buzz = "XYaAbBcCZ0123";

    char pass[] = { 'a',0,0,0,0,0,0,0,0 };

    while(1)
      if ( ! strcmp(crypt(pass, salt), buzz))
        exit(printf("Found %s :-)\n", pass));
      else
        inc(pass);
  }

该代码应该在 nowadays pc上运行一两天(2.10 ^ 11组合),你可以在几台机器上运行,一台从“a”到“gzzzzzzz”,另一台从“haaaaaaa”到“nzzzzzzz”等...例如。

答案 2 :(得分:1)

最有效(尽管可能是最不稳定)的方式可能是找到已经实现它的人(例如使用John the Ripper)。