Statistics
| Branch: | Tag: | Revision:

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 :