Statistics
| Branch: | Tag: | Revision:

root / snf-image-helper / snf-passtohash.py @ 3179b447

History | View | Annotate | Download (1.7 kB)

1 54080484 Nikos Skalkotos
#!/usr/bin/env python
2 54080484 Nikos Skalkotos
#
3 54080484 Nikos Skalkotos
# Copyright (c) 2011 Greek Research and Technology Network
4 54080484 Nikos Skalkotos
#
5 54080484 Nikos Skalkotos
"""Generate a Hash from a given Password 
6 54080484 Nikos Skalkotos

7 54080484 Nikos Skalkotos
This program takes a Password as an argument and
8 54080484 Nikos Skalkotos
returns to standard output a hash followed by a newline.
9 54080484 Nikos Skalkotos
To do this, it generates internally a random salt.
10 54080484 Nikos Skalkotos

11 54080484 Nikos Skalkotos
"""
12 54080484 Nikos Skalkotos
13 54080484 Nikos Skalkotos
import sys
14 54080484 Nikos Skalkotos
import crypt 
15 54080484 Nikos Skalkotos
16 54080484 Nikos Skalkotos
from string import ascii_letters, digits
17 54080484 Nikos Skalkotos
from random import choice
18 54080484 Nikos Skalkotos
from os.path import basename
19 54080484 Nikos Skalkotos
from optparse import OptionParser
20 54080484 Nikos Skalkotos
21 54080484 Nikos Skalkotos
22 54080484 Nikos Skalkotos
# This dictionary maps the hashing algorithm method
23 54080484 Nikos Skalkotos
# with its <ID> as documented in:
24 54080484 Nikos Skalkotos
# http://www.akkadia.org/drepper/SHA-crypt.txt
25 54080484 Nikos Skalkotos
HASH_ID_FROM_METHOD = {
26 54080484 Nikos Skalkotos
    'md5': '1',
27 54080484 Nikos Skalkotos
    'blowfish': '2a',
28 54080484 Nikos Skalkotos
    'sun-md5': 'md5',
29 54080484 Nikos Skalkotos
    'sha256': '5',
30 54080484 Nikos Skalkotos
    'sha512': '6'
31 54080484 Nikos Skalkotos
}
32 54080484 Nikos Skalkotos
33 54080484 Nikos Skalkotos
def random_salt(length=8):
34 54080484 Nikos Skalkotos
    pool = ascii_letters + digits + "/" + "."
35 54080484 Nikos Skalkotos
    return ''.join(choice(pool) for i in range(length))
36 54080484 Nikos Skalkotos
37 54080484 Nikos Skalkotos
38 54080484 Nikos Skalkotos
def parse_arguments(input_args):
39 54080484 Nikos Skalkotos
    usage = "usage: %prog [-h] [-m encrypt-method] <password>"
40 54080484 Nikos Skalkotos
    parser = OptionParser(usage=usage)
41 54080484 Nikos Skalkotos
    parser.add_option("-m", "--encrypt-method",
42 54080484 Nikos Skalkotos
                        dest="encrypt_method",
43 54080484 Nikos Skalkotos
                        type='choice',
44 54080484 Nikos Skalkotos
                        default="sha512",
45 54080484 Nikos Skalkotos
                        choices=HASH_ID_FROM_METHOD.keys(),
46 54080484 Nikos Skalkotos
                        help="encrypt password with ENCRYPT_METHOD [%default] \
47 54080484 Nikos Skalkotos
                        (supported: " + ", ".join(HASH_ID_FROM_METHOD.keys()) +")",
48 54080484 Nikos Skalkotos
    )
49 54080484 Nikos Skalkotos
50 54080484 Nikos Skalkotos
    (opts, args) = parser.parse_args(input_args)
51 54080484 Nikos Skalkotos
52 54080484 Nikos Skalkotos
    if len(args) != 1:
53 54080484 Nikos Skalkotos
        parser.error('password is missing')
54 54080484 Nikos Skalkotos
55 54080484 Nikos Skalkotos
    return (args[0], opts.encrypt_method)
56 54080484 Nikos Skalkotos
57 54080484 Nikos Skalkotos
58 54080484 Nikos Skalkotos
def main():
59 54080484 Nikos Skalkotos
    (password, method) = parse_arguments(sys.argv[1:])
60 54080484 Nikos Skalkotos
    salt = random_salt()
61 54080484 Nikos Skalkotos
    hash = crypt.crypt(password, "$"+HASH_ID_FROM_METHOD[method]+"$"+salt)
62 54080484 Nikos Skalkotos
    sys.stdout.write("%s\n" % (hash))
63 54080484 Nikos Skalkotos
    return 0
64 54080484 Nikos Skalkotos
65 54080484 Nikos Skalkotos
if __name__ == "__main__":
66 54080484 Nikos Skalkotos
        sys.exit(main())
67 54080484 Nikos Skalkotos
68 54080484 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :