root / snf-image-helper / snf-passtohash.py @ 5972f9df
History | View | Annotate | Download (2.4 kB)
1 | 54080484 | Nikos Skalkotos | #!/usr/bin/env python
|
---|---|---|---|
2 | 7e5d635b | Nikos Skalkotos | |
3 | 7e5d635b | Nikos Skalkotos | # Copyright (C) 2011 GRNET S.A.
|
4 | 7e5d635b | Nikos Skalkotos | #
|
5 | 7e5d635b | Nikos Skalkotos | # This program is free software; you can redistribute it and/or modify
|
6 | 7e5d635b | Nikos Skalkotos | # it under the terms of the GNU General Public License as published by
|
7 | 7e5d635b | Nikos Skalkotos | # the Free Software Foundation; either version 2 of the License, or
|
8 | 7e5d635b | Nikos Skalkotos | # (at your option) any later version.
|
9 | 54080484 | Nikos Skalkotos | #
|
10 | 7e5d635b | Nikos Skalkotos | # This program is distributed in the hope that it will be useful, but
|
11 | 7e5d635b | Nikos Skalkotos | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 | 7e5d635b | Nikos Skalkotos | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13 | 7e5d635b | Nikos Skalkotos | # General Public License for more details.
|
14 | 54080484 | Nikos Skalkotos | #
|
15 | 7e5d635b | Nikos Skalkotos | # You should have received a copy of the GNU General Public License
|
16 | 7e5d635b | Nikos Skalkotos | # along with this program; if not, write to the Free Software
|
17 | 7e5d635b | Nikos Skalkotos | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
18 | 7e5d635b | Nikos Skalkotos | # 02110-1301, USA.
|
19 | 7e5d635b | Nikos Skalkotos | |
20 | 6a95db10 | Vangelis Koukis | """Generate a hash from a given password
|
21 | 54080484 | Nikos Skalkotos |
|
22 | 6a95db10 | Vangelis Koukis | This program takes a password as an argument and
|
23 | 54080484 | Nikos Skalkotos | returns to standard output a hash followed by a newline.
|
24 | 6a95db10 | Vangelis Koukis | To do this, it generates a random salt internally.
|
25 | 54080484 | Nikos Skalkotos |
|
26 | 54080484 | Nikos Skalkotos | """
|
27 | 54080484 | Nikos Skalkotos | |
28 | 54080484 | Nikos Skalkotos | import sys |
29 | 54080484 | Nikos Skalkotos | import crypt |
30 | 54080484 | Nikos Skalkotos | |
31 | 54080484 | Nikos Skalkotos | from string import ascii_letters, digits |
32 | 54080484 | Nikos Skalkotos | from random import choice |
33 | 54080484 | Nikos Skalkotos | from os.path import basename |
34 | 54080484 | Nikos Skalkotos | from optparse import OptionParser |
35 | 54080484 | Nikos Skalkotos | |
36 | 54080484 | Nikos Skalkotos | |
37 | 54080484 | Nikos Skalkotos | # This dictionary maps the hashing algorithm method
|
38 | 54080484 | Nikos Skalkotos | # with its <ID> as documented in:
|
39 | 54080484 | Nikos Skalkotos | # http://www.akkadia.org/drepper/SHA-crypt.txt
|
40 | 54080484 | Nikos Skalkotos | HASH_ID_FROM_METHOD = { |
41 | 54080484 | Nikos Skalkotos | 'md5': '1', |
42 | 54080484 | Nikos Skalkotos | 'blowfish': '2a', |
43 | 54080484 | Nikos Skalkotos | 'sun-md5': 'md5', |
44 | 54080484 | Nikos Skalkotos | 'sha256': '5', |
45 | 54080484 | Nikos Skalkotos | 'sha512': '6' |
46 | 54080484 | Nikos Skalkotos | } |
47 | 54080484 | Nikos Skalkotos | |
48 | 54080484 | Nikos Skalkotos | def random_salt(length=8): |
49 | 54080484 | Nikos Skalkotos | pool = ascii_letters + digits + "/" + "." |
50 | 54080484 | Nikos Skalkotos | return ''.join(choice(pool) for i in range(length)) |
51 | 54080484 | Nikos Skalkotos | |
52 | 54080484 | Nikos Skalkotos | |
53 | 54080484 | Nikos Skalkotos | def parse_arguments(input_args): |
54 | 54080484 | Nikos Skalkotos | usage = "usage: %prog [-h] [-m encrypt-method] <password>"
|
55 | 54080484 | Nikos Skalkotos | parser = OptionParser(usage=usage) |
56 | 54080484 | Nikos Skalkotos | parser.add_option("-m", "--encrypt-method", |
57 | 54080484 | Nikos Skalkotos | dest="encrypt_method",
|
58 | 54080484 | Nikos Skalkotos | type='choice',
|
59 | 54080484 | Nikos Skalkotos | default="sha512",
|
60 | 54080484 | Nikos Skalkotos | choices=HASH_ID_FROM_METHOD.keys(), |
61 | 54080484 | Nikos Skalkotos | help="encrypt password with ENCRYPT_METHOD [%default] \
|
62 | 54080484 | Nikos Skalkotos | (supported: " + ", ".join(HASH_ID_FROM_METHOD.keys()) +")", |
63 | 54080484 | Nikos Skalkotos | ) |
64 | 54080484 | Nikos Skalkotos | |
65 | 54080484 | Nikos Skalkotos | (opts, args) = parser.parse_args(input_args) |
66 | 54080484 | Nikos Skalkotos | |
67 | 54080484 | Nikos Skalkotos | if len(args) != 1: |
68 | 54080484 | Nikos Skalkotos | parser.error('password is missing')
|
69 | 54080484 | Nikos Skalkotos | |
70 | 54080484 | Nikos Skalkotos | return (args[0], opts.encrypt_method) |
71 | 54080484 | Nikos Skalkotos | |
72 | 54080484 | Nikos Skalkotos | |
73 | 54080484 | Nikos Skalkotos | def main(): |
74 | 54080484 | Nikos Skalkotos | (password, method) = parse_arguments(sys.argv[1:])
|
75 | 54080484 | Nikos Skalkotos | salt = random_salt() |
76 | 54080484 | Nikos Skalkotos | hash = crypt.crypt(password, "$"+HASH_ID_FROM_METHOD[method]+"$"+salt) |
77 | 54080484 | Nikos Skalkotos | sys.stdout.write("%s\n" % (hash)) |
78 | 54080484 | Nikos Skalkotos | return 0 |
79 | 54080484 | Nikos Skalkotos | |
80 | 54080484 | Nikos Skalkotos | if __name__ == "__main__": |
81 | 54080484 | Nikos Skalkotos | sys.exit(main()) |
82 | 54080484 | Nikos Skalkotos | |
83 | 54080484 | Nikos Skalkotos | # vim: set sta sts=4 shiftwidth=4 sw=4 et ai : |