stdlibs/libcrypt/doc/crypt.3
author hgs
Tue, 02 Nov 2010 19:23:22 +0530
changeset 79 564bc7b7ad27
permissions -rw-r--r--
201043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
79
hgs
parents:
diff changeset
     1
.\" Portions Copyright © 2005-2006 Nokia. All rights reserved.
hgs
parents:
diff changeset
     2
.\" FreeSec: libcrypt for NetBSD
hgs
parents:
diff changeset
     3
.\"
hgs
parents:
diff changeset
     4
.\" Copyright (c) 1994 David Burren
hgs
parents:
diff changeset
     5
.\" All rights reserved.
hgs
parents:
diff changeset
     6
.\"
hgs
parents:
diff changeset
     7
.\" Redistribution and use in source and binary forms, with or without
hgs
parents:
diff changeset
     8
.\" modification, are permitted provided that the following conditions
hgs
parents:
diff changeset
     9
.\" are met:
hgs
parents:
diff changeset
    10
.\" 1. Redistributions of source code must retain the above copyright
hgs
parents:
diff changeset
    11
.\"    notice, this list of conditions and the following disclaimer.
hgs
parents:
diff changeset
    12
.\" 2. Redistributions in binary form must reproduce the above copyright
hgs
parents:
diff changeset
    13
.\"    notice, this list of conditions and the following disclaimer in the
hgs
parents:
diff changeset
    14
.\"    documentation and/or other materials provided with the distribution.
hgs
parents:
diff changeset
    15
.\" 4. Neither the name of the author nor the names of other contributors
hgs
parents:
diff changeset
    16
.\"    may be used to endorse or promote products derived from this software
hgs
parents:
diff changeset
    17
.\"    without specific prior written permission.
hgs
parents:
diff changeset
    18
.\"
hgs
parents:
diff changeset
    19
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
hgs
parents:
diff changeset
    20
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
hgs
parents:
diff changeset
    21
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
hgs
parents:
diff changeset
    22
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
hgs
parents:
diff changeset
    23
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
hgs
parents:
diff changeset
    24
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
hgs
parents:
diff changeset
    25
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
hgs
parents:
diff changeset
    26
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
hgs
parents:
diff changeset
    27
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
hgs
parents:
diff changeset
    28
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
hgs
parents:
diff changeset
    29
.\" SUCH DAMAGE.
hgs
parents:
diff changeset
    30
.\"
hgs
parents:
diff changeset
    31
.\" $FreeBSD: src/lib/libcrypt/crypt.3,v 1.31 2005/02/09 18:03:14 ru Exp $
hgs
parents:
diff changeset
    32
.\"
hgs
parents:
diff changeset
    33
.Dd January 19, 1997
hgs
parents:
diff changeset
    34
.Dt CRYPT 3
hgs
parents:
diff changeset
    35
.Os
hgs
parents:
diff changeset
    36
.Sh NAME
hgs
parents:
diff changeset
    37
.Nm crypt
hgs
parents:
diff changeset
    38
.Nd password and data encryption
hgs
parents:
diff changeset
    39
.Sh LIBRARY
hgs
parents:
diff changeset
    40
.Lb libcrypt
hgs
parents:
diff changeset
    41
.Sh SYNOPSIS
hgs
parents:
diff changeset
    42
.In unistd.h
hgs
parents:
diff changeset
    43
.Ft char *
hgs
parents:
diff changeset
    44
.Fn crypt "const char *key" "const char *salt"
hgs
parents:
diff changeset
    45
.Sh RETURN VALUES
hgs
parents:
diff changeset
    46
The
hgs
parents:
diff changeset
    47
.Fn crypt
hgs
parents:
diff changeset
    48
function returns a pointer to the encrypted value on success, and NULL on
hgs
parents:
diff changeset
    49
failure.
hgs
parents:
diff changeset
    50
.Pp
hgs
parents:
diff changeset
    51
.Sh DESCRIPTION
hgs
parents:
diff changeset
    52
The
hgs
parents:
diff changeset
    53
.Fn crypt
hgs
parents:
diff changeset
    54
function performs password hashing with additional code added to
hgs
parents:
diff changeset
    55
thwart dictionary attack.
hgs
parents:
diff changeset
    56
Different algorithms can be used in the hash.
hgs
parents:
diff changeset
    57
.\"
hgs
parents:
diff changeset
    58
.\" NOTICE:
hgs
parents:
diff changeset
    59
.\" If you add more algorithms, make sure to update this list
hgs
parents:
diff changeset
    60
.\" and the default used for the Traditional format, below.
hgs
parents:
diff changeset
    61
.\"
hgs
parents:
diff changeset
    62
Currently the implementation supports
hgs
parents:
diff changeset
    63
.Tn Data Encryption Standard (DES) 
hgs
parents:
diff changeset
    64
and
hgs
parents:
diff changeset
    65
.Tn MD5
hgs
parents:
diff changeset
    66
hash algorithms. However, the actual algorithm used during the call to
hgs
parents:
diff changeset
    67
.Fn crypt
hgs
parents:
diff changeset
    68
depends on the 
hgs
parents:
diff changeset
    69
.Fn salt
hgs
parents:
diff changeset
    70
parameter.
hgs
parents:
diff changeset
    71
.Pp
hgs
parents:
diff changeset
    72
The first argument to
hgs
parents:
diff changeset
    73
.Fn crypt 
hgs
parents:
diff changeset
    74
is the data to hash (usually a password), in a
hgs
parents:
diff changeset
    75
.Dv NULL Ns -terminated
hgs
parents:
diff changeset
    76
string.
hgs
parents:
diff changeset
    77
The second is the salt, in one of two forms:
hgs
parents:
diff changeset
    78
.Pp
hgs
parents:
diff changeset
    79
.Bl -tag -width Traditional -compact -offset indent
hgs
parents:
diff changeset
    80
.It Modular
hgs
parents:
diff changeset
    81
If 
hgs
parents:
diff changeset
    82
.Fn salt
hgs
parents:
diff changeset
    83
begins with the string
hgs
parents:
diff changeset
    84
.Dq $digit$
hgs
parents:
diff changeset
    85
then the Modular Crypt Format is used.
hgs
parents:
diff changeset
    86
.It Traditional
hgs
parents:
diff changeset
    87
.Fn salt
hgs
parents:
diff changeset
    88
parameter is a two-character string chosen from the set [a-zA-Z0-9./].
hgs
parents:
diff changeset
    89
.El
hgs
parents:
diff changeset
    90
.Pp
hgs
parents:
diff changeset
    91
.Ss "Modular" crypt:
hgs
parents:
diff changeset
    92
.Pp
hgs
parents:
diff changeset
    93
If
hgs
parents:
diff changeset
    94
.Fn salt
hgs
parents:
diff changeset
    95
begins with the string
hgs
parents:
diff changeset
    96
.Fa $digit$
hgs
parents:
diff changeset
    97
then Modular Crypt Format is used.
hgs
parents:
diff changeset
    98
The
hgs
parents:
diff changeset
    99
.Fa digit
hgs
parents:
diff changeset
   100
identifies the algorithm used for encryption. Currently MD5 hash is implemented. So 
hgs
parents:
diff changeset
   101
.Fa digit
hgs
parents:
diff changeset
   102
will be 1 and hence the second argument to this function will be a string beginning with
hgs
parents:
diff changeset
   103
.Dq $1$
hgs
parents:
diff changeset
   104
followed by at most 8 characters (actual salt to be used in the encryption), and optionally
hgs
parents:
diff changeset
   105
terminated by 
hgs
parents:
diff changeset
   106
.Dq $
hgs
parents:
diff changeset
   107
.
hgs
parents:
diff changeset
   108
If the optional 
hgs
parents:
diff changeset
   109
.Dq $
hgs
parents:
diff changeset
   110
is included then the characters following the dollar sign are ignored. 
hgs
parents:
diff changeset
   111
The output of this operation will be a string
hgs
parents:
diff changeset
   112
containing 34 characters in the format
hgs
parents:
diff changeset
   113
.Dq $1$<string>$
hgs
parents:
diff changeset
   114
.Pp
hgs
parents:
diff changeset
   115
.Dq <string>
hgs
parents:
diff changeset
   116
consists of the actual salt (the at most 8 characters string following 
hgs
parents:
diff changeset
   117
.Dq $1$
hgs
parents:
diff changeset
   118
in the 
hgs
parents:
diff changeset
   119
.Fn salt),
hgs
parents:
diff changeset
   120
followed by 22 bytes of data from the set [a-zA-Z0-9./].
hgs
parents:
diff changeset
   121
.El
hgs
parents:
diff changeset
   122
.Pp
hgs
parents:
diff changeset
   123
Other crypt formats may be easily added.
hgs
parents:
diff changeset
   124
An example salt would be:
hgs
parents:
diff changeset
   125
.Bl -tag -offset indent
hgs
parents:
diff changeset
   126
.It Cm "$4$thesalt$rest"
hgs
parents:
diff changeset
   127
.El
hgs
parents:
diff changeset
   128
.Pp
hgs
parents:
diff changeset
   129
.Ss "Traditional" crypt:
hgs
parents:
diff changeset
   130
.Pp
hgs
parents:
diff changeset
   131
It is based on Data Encryption Standard algorithm (DES).
hgs
parents:
diff changeset
   132
.Fn salt
hgs
parents:
diff changeset
   133
is a two-character string chosen from the set [a-zA-Z0-9./]. In order to thwart the 
hgs
parents:
diff changeset
   134
Dictionary Attack, the two-character 
hgs
parents:
diff changeset
   135
.Fn salt
hgs
parents:
diff changeset
   136
is used to perturb the algorithm in 4096 ways.
hgs
parents:
diff changeset
   137
.Pp
hgs
parents:
diff changeset
   138
The 56-bit key for the DES algorithm is obtained by taking the lowest 7 bits of each 
hgs
parents:
diff changeset
   139
of the first eight characters of the 
hgs
parents:
diff changeset
   140
.Fn key.
hgs
parents:
diff changeset
   141
The key thus obtained is used to encrypt a constant string (a string containing all zeroes).
hgs
parents:
diff changeset
   142
.Pp
hgs
parents:
diff changeset
   143
The return value of this function is a pointer to a static buffer. So the function
hgs
parents:
diff changeset
   144
is not reentrant.
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
.Sh Example
hgs
parents:
diff changeset
   147
.Bd -literal -offset indent
hgs
parents:
diff changeset
   148
#include <stdlib.h>
hgs
parents:
diff changeset
   149
#include <unistd.h>
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
void crypt_user()
hgs
parents:
diff changeset
   152
{
hgs
parents:
diff changeset
   153
	char *p = NULL,
hgs
parents:
diff changeset
   154
	     *q = NULL;
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
	/* Invoke crypt() to perform password hashing */
hgs
parents:
diff changeset
   157
	p = crypt("password", "S1");	/* p contains the hash of "password"
hgs
parents:
diff changeset
   158
						 * when "S1" is used as the key. DES
hgs
parents:
diff changeset
   159
						 * encryption algoritm is used in this
hgs
parents:
diff changeset
   160
						 * scenario
hgs
parents:
diff changeset
   161
						 */
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
	q = crypt("password", "$1$Salt1");
hgs
parents:
diff changeset
   164
						/* q contains the hash of "password"
hgs
parents:
diff changeset
   165
						 * as computed by the MD5 hash algorithm
hgs
parents:
diff changeset
   166
						 */
hgs
parents:
diff changeset
   167
}
hgs
parents:
diff changeset
   168
.Ed
hgs
parents:
diff changeset
   169
.Sh SEE ALSO
hgs
parents:
diff changeset
   170
.Sh BUGS
hgs
parents:
diff changeset
   171
Output of 
hgs
parents:
diff changeset
   172
.Fn crypt
hgs
parents:
diff changeset
   173
differs from that of Linux's when NULL passed as 
hgs
parents:
diff changeset
   174
.Fn salt .