root / snf-image-helper / snf-passtohash.py @ 6a95db10
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 | 6a95db10 | Vangelis Koukis | """Generate a hash from a given password
|
6 | 54080484 | Nikos Skalkotos |
|
7 | 6a95db10 | Vangelis Koukis | This program takes a password as an argument and
|
8 | 54080484 | Nikos Skalkotos | returns to standard output a hash followed by a newline.
|
9 | 6a95db10 | Vangelis Koukis | To do this, it generates a random salt internally.
|
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 : |