Gnomon can tether time or tide. - Robert Burns, 1790

Ops Notes

Author:

Dimitry Dukhovny

Creating and communicating passwords

Users are unreliable. They forget passwords.

Processes sometimes suck and require you to set passwords. It’s a worst-practice and yet it’s a common one. The least we can do is stop pretending it doesn’t happen and give you some tools to handle it.

Create UNIX password hash

I use a simple script I call hashit.sh.

Similar code is all over the Internet, but the orignal source seems to be the ActiveState official website.

1python -c "import getpass, sys, random, string, crypt;
2randomsalt = ''.join(random.sample(string.ascii_letters,8));
3sys.stdout.write(crypt.crypt(getpass.getpass(), '\$6\$%s\$' % randomsalt))"

Store or communicate a password reliably

Given font differences and difficulty hearing things clearly by phone, phonetics are definitely the way to go for password storage and communication.

Download ddpwprint.py

  1#!/usr/bin/python
  2
  3###############################################################
  4# Title:   (U) ddpwprint.py
  5# Source:  (U) Dimitry Dukhovny dimitry.dukhovny@gmail.com
  6# History: (U) 20171220.1822Z:  Added commandline switches, piped input,
  7#              and password generator
  8#          (U) 20170404.1838Z:  Initial version
  9# Purpose: (U) Print (usually passwords) in phonetics to correct for font
 10#               problems.
 11# License: (U) GPL
 12#          (U) Source code and original attribution must be
 13#               distributed, even if the original source was
 14#               modified.  No commercial redistribution for
 15#               trade, sale, or barter permitted without the
 16#               permission of the author.
 17
 18import sys
 19import re
 20
 21
 22phoneticascii = {
 23    chr(32): 'space',
 24    chr(33): 'exclamation_mark',
 25    chr(34): 'double_quote',
 26    chr(35): 'number',
 27    chr(36): 'dollar',
 28    chr(37): 'percent',
 29    chr(38): 'ampersand',
 30    chr(39): 'single_quote',
 31    chr(40): 'left_parenthesis',
 32    chr(41): 'right_parenthesis',
 33    chr(42): 'asterisk',
 34    chr(43): 'plus',
 35    chr(44): 'comma',
 36    chr(45): 'minus',
 37    chr(46): 'period',
 38    chr(47): 'slash',
 39    chr(48): 'zero',
 40    chr(49): 'one',
 41    chr(50): 'two',
 42    chr(51): 'three',
 43    chr(52): 'four',
 44    chr(53): 'five',
 45    chr(54): 'six',
 46    chr(55): 'seven',
 47    chr(56): 'eight',
 48    chr(57): 'nine',
 49    chr(58): 'colon',
 50    chr(59): 'semicolon',
 51    chr(60): 'less_than',
 52    chr(61): 'equality_sign',
 53    chr(62): 'greater_than',
 54    chr(63): 'question_mark',
 55    chr(64): 'at_sign',
 56    chr(65): 'upper_alpha',
 57    chr(66): 'upper_bravo',
 58    chr(67): 'upper_charlie',
 59    chr(68): 'upper_delta',
 60    chr(69): 'upper_echo',
 61    chr(70): 'upper_foxtrot',
 62    chr(71): 'upper_golf',
 63    chr(72): 'upper_hotel',
 64    chr(73): 'upper_india',
 65    chr(74): 'upper_juliet',
 66    chr(75): 'upper_kilo',
 67    chr(76): 'upper_lima',
 68    chr(77): 'upper_mike',
 69    chr(78): 'upper_november',
 70    chr(79): 'upper_oscar',
 71    chr(80): 'upper_papa',
 72    chr(81): 'upper_quebec',
 73    chr(82): 'upper_romeo',
 74    chr(83): 'upper_sierra',
 75    chr(84): 'upper_tango',
 76    chr(85): 'upper_uniform',
 77    chr(86): 'upper_victor',
 78    chr(87): 'upper_whiskey',
 79    chr(88): 'upper_xray',
 80    chr(89): 'upper_yankee',
 81    chr(90): 'zulu',
 82    chr(91): 'left_bracket',
 83    chr(92): 'backslash',
 84    chr(93): 'right_bracket',
 85    chr(94): 'caret',
 86    chr(95): 'underscore',
 87    chr(96): 'grave',
 88    chr(97): 'alpha',
 89    chr(98): 'bravo',
 90    chr(99): 'charlie',
 91    chr(100): 'delta',
 92    chr(101): 'echo',
 93    chr(102): 'foxtrot',
 94    chr(103): 'golf',
 95    chr(104): 'hotel',
 96    chr(105): 'india',
 97    chr(106): 'juliet',
 98    chr(107): 'kilo',
 99    chr(108): 'lima',
100    chr(109): 'mike',
101    chr(110): 'november',
102    chr(111): 'oscar',
103    chr(112): 'papa',
104    chr(113): 'quebec',
105    chr(114): 'romeo',
106    chr(115): 'sierra',
107    chr(116): 'tango',
108    chr(117): 'uniform',
109    chr(118): 'victor',
110    chr(119): 'whiskey',
111    chr(120): 'xray',
112    chr(121): 'yankee',
113    chr(122): 'zulu',
114    chr(123): 'left_brace',
115    chr(124): 'vertical_bar',
116    chr(125): 'right_brace',
117    chr(126): 'tilde'
118    }
119
120
121def phonetic(inchar=''):
122    '''Tries to return a phonetic value from the ASCII dictionary.  Returns
123    an empty string if you feed it an unprintable character.'''
124    inchar = str(inchar)
125    try:
126        return(phoneticascii[inchar])
127    except:
128        return('')
129
130
131def getphonetic(intext):
132    '''Validates intext and iterates over it with phonetic().'''
133    try:
134        intext = str(intext)
135    except:
136        sys.stderr.write('Your input isn\'t a string.  Sorry.\n')
137        return(False)
138    outtext = map(phonetic, intext)
139    return(outtext)
140
141
142def printphonetic(intext):
143    '''Iterates over intext.  Anything set off in quotes is treated as one
144    entry, unless you escape the quotes.'''
145    sys.stdout.write('\n--\nPassword:  ' + intext + '\n')
146    outtext = getphonetic(intext)
147    if outtext:
148        map(lambda x:  sys.stdout.write('         ' + x + '\n'), outtext)
149        return(True)
150    else:
151        return(False)
152
153def main(argv=[None]):
154    map(printphonetic, argv[1:])
155    map(printphonetic, sys.stdin)
156
157if __name__ == '__main__':
158    main(sys.argv)

You can read the output clearly to most government and military officials.

IO Procedures

See IO Procedures.

Government Jargon

See Government Jargon.