~smoser/cirros/trunk.letsplay2

« back to all changes in this revision

Viewing changes to bin/encrypt-pass

  • Committer: Scott Moser
  • Date: 2016-07-15 14:09:44 UTC
  • Revision ID: smoser@ubuntu.com-20160715140944-c1w4xdd40ced90t3
bin/encrypt-pass: add tool for converting plaintext to encrypted

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/bin/sh
 
2
# vi: ts=4 noexpandtab
 
3
Usage() {
 
4
   cat <<EOF
 
5
Usage: ${0##*/} password [format]
 
6
 
 
7
convert password to crypt'd password suitable for /etc/shadow
 
8
 
 
9
  format is one of:
 
10
     md5 [default]
 
11
     sha256
 
12
     sha512
 
13
EOF
 
14
}
 
15
 
 
16
encrypt_pass() {
 
17
        local pass="$1" fmt="${2:-md5}" fmt_arg=""
 
18
        case "$fmt" in
 
19
                md5) fmt_arg='$1$';;
 
20
                sha256) fmt_arg='$5$';;
 
21
                sha512) fmt_arg='$6$';;
 
22
                \$*\$) fmt_arg="$fmt";;
 
23
        esac
 
24
        enc=$(echo "$pass" |
 
25
                perl -e '
 
26
                        $p=<STDIN>; chomp($p);
 
27
                        $salt = join "", map { (q(a)..q(z))[rand(26)] } 1 .. 8;
 
28
                        if (${ARGV[0]}) { $salt = "${ARGV[0]}$salt\$"; }
 
29
                        print crypt($p, "$salt") . "\n";' "$fmt_arg") || return
 
30
        [ -n "${enc}" ] && [ "${enc#${fmt_arg}}" != "${enc}" ] &&
 
31
                _RET="$enc"
 
32
}
 
33
error() { echo "$@" 1>&2; }
 
34
fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
 
35
 
 
36
[ "$1" = "--help" -o "$1" = "-h" ] && { Usage; exit 0; }
 
37
if ! [ $# -eq 1 -o $# -eq 2 ]; then 
 
38
        Usage 1>&2
 
39
        error "got $# args, expected 1 or 2"
 
40
        exit 1
 
41
fi
 
42
 
 
43
password="$1"
 
44
fmt=${2:-md5}
 
45
if [ "$1" = "-" ]; then
 
46
   read password || fail "failed to read password from stdin"
 
47
fi
 
48
 
 
49
encrypt_pass "$password" "$fmt" || fail "failed to encrypt password in '$fmt'"
 
50
echo "$_RET"