免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4325 | 回复: 1
打印 上一主题 下一主题

[Mail] md5-crypt 加密的密码如何得到? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-24 22:25 |只看该作者 |倒序浏览
比如 123 如果经过md5-crypt加密,是怎么样一串数字?

是用什么方法得到的呢?





论坛徽章:
0
2 [报告]
发表于 2003-07-25 10:09 |只看该作者

md5-crypt 加密的密码如何得到?

unix里有简单的DES加密,是64位的有效密码。你可以使用perl或者c里的crypt函数来生成加密后的密码。crypt函数的用法如下:
生成公式:    密码=crypt("plain text", "salt";
验证公式:    密码=crypt("plain text", "密码";

即可以通过验证公式来验证从用户端得到的getpasswd的原文是否正确。

md5密码也可以使用crypt函数得到用法一摸一样,只是生成公式的salt(生成种子)特殊一点。你可以测试一下:
if ((crypted = (const char *)    /* MD5 */
                crypt("test", "$1$12345678$") != NULL &&
               strcmp(crypted, "$1$12345678$oEitTZYQtRHfNGmsFvTBA/" == 0) {
            /*MD5密码可以crypt*/
}

生成密码时salt字符串一般是$1$XXXXXXXX
“X”表示“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./”字符串中的一个某个字符。


另外在C中调用crypt函数要编译时链接crypt库。


以下是典型的密码生成代码:(C)


static char *best_crypt(const char * const pwd)
{
    static const char crcars[64] =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";
    register const char *crypted;
   
    if ((crypted = (const char *)      /* Blowfish */
         crypt("test", "$2a$07$1234567890123456789012") != NULL &&        
        strcmp(crypted, "$2a$07$123456789012345678901uKO4"
               "/IReKqBzRzT6YaajGvw20UBdHW7m" == 0) {
        char salt[] = "$2a$07$0000000000000000000000";        
        int c = 28;
        
        do {            
            c--;
            salt[c] = crcars[pw_zrand() & 63];
        } while (c >; 7);
        
        return (char *) crypt(pwd, salt);        
    } else if ((crypted = (const char *)    /* MD5 */
                crypt("test", "$1$12345678$") != NULL &&
               strcmp(crypted, "$1$12345678$oEitTZYQtRHfNGmsFvTBA/" == 0) {
        char salt[] = "$1$00000000";
        int c = 10;
        
        do {            
            c--;
            salt[c] = crcars[pw_zrand() & 63];
        } while (c >; 3);
        
        return (char *) crypt(pwd, salt);
    } else if ((crypted = (const char *)    /* Extended DES */
                crypt("test", "_.../1234") != NULL &&
               strcmp(crypted, "_.../1234PAPUVmqGzpU" == 0) {
        char salt[] = "_.../0000";
        int c = 8;
        
        do {
            c--;
            salt[c] = crcars[pw_zrand() & 63];
        } while (c >; 5);
        
        return (char *) crypt(pwd, salt);
    }
    /* Simple DES */
    {
        char salt[] = "00";
        
        salt[0] = crcars[pw_zrand() & 63];
        salt[1] = crcars[pw_zrand() & 63];
        
        return (char *) crypt(pwd, salt);        
    }   
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP