- 论坛徽章:
- 0
|
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);
}
} |
|