Skip to content

Commit 8704175

Browse files
committed
ch09
1 parent 48cef73 commit 8704175

File tree

15 files changed

+374
-0
lines changed

15 files changed

+374
-0
lines changed

ch09/hlib.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# hlib.py
2+
# NOT A PYTHON MODULE - DO NOT ATTEMPT TO RUN
3+
4+
# hlib.py
5+
>>> import hashlib
6+
>>> hashlib.algorithms_available
7+
{'mdc2', 'sha224', 'whirlpool', 'sha1', 'sha3_512', 'sha512_256',
8+
'sha256', 'md4', 'sha384', 'blake2s', 'sha3_224', 'sha3_384',
9+
'shake_256', 'blake2b', 'ripemd160', 'sha512', 'md5-sha1',
10+
'shake_128', 'sha3_256', 'sha512_224', 'md5', 'sm3'}
11+
>>> hashlib.algorithms_guaranteed
12+
{'blake2s', 'md5', 'sha224', 'sha3_512', 'shake_256', 'sha3_256',
13+
'shake_128', 'sha256', 'sha1', 'sha512', 'blake2b', 'sha3_384',
14+
'sha384', 'sha3_224'}
15+
16+
>>> h = hashlib.blake2b()
17+
>>> h.update(b'Hash me')
18+
>>> h.update(b' now!')
19+
>>> h.hexdigest()
20+
'56441b566db9aafcf8cdad3a4729fa4b2bfaab0ada36155ece29f52ff70e1e9d'
21+
'7f54cacfe44bc97c7e904cf79944357d023877929430bc58eb2dae168e73cedf'
22+
>>> h.digest()
23+
b'VD\x1bVm\xb9\xaa\xfc\xf8\xcd\xad:G)\xfaK+\xfa\xab\n\xda6\x15^'
24+
b'\xce)\xf5/\xf7\x0e\x1e\x9d\x7fT\xca\xcf\xe4K\xc9|~\x90L\xf7'
25+
b'\x99D5}\x028w\x92\x940\xbcX\xeb-\xae\x16\x8es\xce\xdf'
26+
>>> h.block_size
27+
128
28+
>>> h.digest_size
29+
64
30+
>>> h.name
31+
'blake2b'
32+
33+
>>> hashlib.sha256(b'Hash me now!').hexdigest()
34+
'10d561fa94a89a25ea0c7aa47708bdb353bbb062a17820292cd905a3a60d6783'
35+
36+
37+
>>> import hashlib
38+
>>> h1 = hashlib.blake2b(b'Important data', digest_size=16,
39+
... person=b'part-1')
40+
>>> h2 = hashlib.blake2b(b'Important data', digest_size=16,
41+
... person=b'part-2')
42+
>>> h3 = hashlib.blake2b(b'Important data', digest_size=16)
43+
>>> h1.hexdigest()
44+
'c06b9af95d5aa6307e7e3fd025a15646'
45+
>>> h2.hexdigest()
46+
'9cb03be8f3114d0f06bddaedce2079c4'
47+
>>> h3.hexdigest()
48+
'7d35308ca3b042b5184728d2b1283d0d'
49+
50+
>>> import os
51+
>>> dk = hashlib.pbkdf2_hmac('sha256', b'Password123',
52+
... salt=os.urandom(16), iterations=100000)
53+
>>> dk.hex()
54+
'f8715c37906df067466ce84973e6e52a955be025a59c9100d9183c4cbec27a9e'

ch09/hmc.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# hmc.py
2+
import hmac
3+
import hashlib
4+
5+
6+
def calc_digest(key, message):
7+
key = bytes(key, 'utf-8')
8+
message = bytes(message, 'utf-8')
9+
10+
dig = hmac.new(key, message, hashlib.sha256)
11+
return dig.hexdigest()
12+
13+
14+
mac = calc_digest('secret-key', 'Important Message')
15+
print(mac)

ch09/jwt/claims_auth.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# jwt/claims_auth.py
2+
import jwt
3+
4+
5+
data = {'payload': 'data', 'iss': 'hein', 'aud': 'learn-python'}
6+
7+
8+
secret = 'secret-key'
9+
token = jwt.encode(data, secret)
10+
11+
12+
def decode(token, secret, issuer=None, audience=None):
13+
try:
14+
print(jwt.decode(token, secret, issuer=issuer,
15+
audience=audience, algorithms=["HS256"]))
16+
except (
17+
jwt.InvalidIssuerError, jwt.InvalidAudienceError
18+
) as err:
19+
print(err)
20+
print(type(err))
21+
22+
23+
decode(token, secret)
24+
25+
# not providing the issuer won't break
26+
decode(token, secret, audience='learn-python')
27+
28+
# not providing the audience will break
29+
decode(token, secret, issuer='hein')
30+
31+
# both will break
32+
decode(token, secret, issuer='wrong', audience='learn-python')
33+
decode(token, secret, issuer='hein', audience='wrong')
34+
35+
decode(token, secret, issuer='hein', audience='learn-python')
36+
37+
38+
"""
39+
$ python jwt/claims_time.py
40+
Invalid audience
41+
<class 'jwt.exceptions.InvalidAudienceError'>
42+
43+
{'payload': 'data', 'iss': 'hein', 'aud': 'learn-python'}
44+
45+
Invalid audience
46+
<class 'jwt.exceptions.InvalidAudienceError'>
47+
48+
Invalid issuer
49+
<class 'jwt.exceptions.InvalidIssuerError'>
50+
51+
Invalid audience
52+
<class 'jwt.exceptions.InvalidAudienceError'>
53+
54+
{'payload': 'data', 'iss': 'hein', 'aud': 'learn-python'}
55+
"""

ch09/jwt/claims_time.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# jwt/claims_time.py
2+
from datetime import datetime, timedelta, timezone
3+
from time import sleep, time
4+
5+
import jwt
6+
7+
8+
iat = datetime.now(tz=timezone.utc)
9+
nfb = iat + timedelta(seconds=1)
10+
exp = iat + timedelta(seconds=3)
11+
12+
13+
data = {'payload': 'data', 'nbf': nfb, 'exp': exp, 'iat': iat}
14+
15+
16+
def decode(token, secret):
17+
print(time())
18+
try:
19+
print(jwt.decode(token, secret, algorithms=['HS256']))
20+
except (
21+
jwt.ImmatureSignatureError, jwt.ExpiredSignatureError
22+
) as err:
23+
print(err)
24+
print(type(err))
25+
26+
27+
secret = 'secret-key'
28+
token = jwt.encode(data, secret)
29+
30+
31+
decode(token, secret)
32+
sleep(2)
33+
decode(token, secret)
34+
sleep(2)
35+
decode(token, secret)
36+
37+
38+
"""
39+
$ python jwt/claims_time.py
40+
1631043839.6459477
41+
The token is not yet valid (nbf)
42+
<class 'jwt.exceptions.ImmatureSignatureError'>
43+
1631043841.6480813
44+
{'payload': 'data', 'nbf': 1631043840, 'exp': 1631043842, 'iat':
45+
1631043839}
46+
1631043843.6498601
47+
Signature has expired
48+
<class 'jwt.exceptions.ExpiredSignatureError'>
49+
"""

ch09/jwt/rsa/key

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEogIBAAKCAQEAz87T1pNQnbPZLSxuHP8y0HQDcNsKpwd1LwtghPld9l0lK6f2
3+
pDNlJYwqI0il8JUfIfWE9VaO9KsxTfBtYPyLO8Tz7Nk+04KDlkQOKgpKJHrYTd+5
4+
iSre3D68IVHdxBku2VFh57uqBNJCqGBF0OgVHh/ms9f0kDVaaUNSj7kMu5sLVPWR
5+
vnZgyJN0v/LHS2y22tkXncj7wf9kC13qN36MsZ2qH4VF0f8/WTkE6zUSdTwY2ZEv
6+
K66zjmTfuFoQ8df5N5Pj4STQGk+2l6uU/kxNbBNWjYmJNp1EpdJJ3m9A1nDrRRQf
7+
M1HdckOCJVn+eYDrzD2W/bSMm/3SgqzM3o1ONQIDAQABAoIBADv9QgwUlNYhwBUZ
8+
WWRHi3y/sOqYYRfcwEhnaWKZtjVTqFJU949pQs63CscKxtSPx9/+x3Ynmbcp4F7W
9+
hEzWOr9zWNNL16YpbCEp3kjmlYa4a873QdFGLfW4qoiX4IQmnO6hXrkN5MPlitae
10+
jCkFhmse3HOYaQJkVIhEpgXVbsaNMvSa6woAfT5tVPSxDSEdB4a61zwSpssYfLMF
11+
ZFsHEV6mE6hkmfZxw22/I2I7Up0sV6f7KOgjoPaeqL6i5ibEhIWzDyQiKyW6YN3j
12+
moZNrIAHoq8oAP9wWavrpbnslp5c3SculUueVxdUv46LDy9RbmFOajdaJALFdY/D
13+
NI+X7WECgYEA+qBnI0cHmYfOqGeSVUsTPUk0uG8N2fDWh1m4GPRzU4a00Mh7nG+l
14+
8j54FDLqQeoWyWN0808dRMakjeHNzjIEi8paHbrrWIS+4Xp8pVH56iCG9wTtbj6j
15+
ni5CeoKFtRd3NcqwTOWznR+OvE02WzqE8kDQbNmT1Y68MPf/4vEpABkCgYEA1ENo
16+
pKknQv+e9ZapWtHk6DDtq/Xw/R+VadwfGBDdIU1XQsUjlTw/igeElrDQOPVao8xL
17+
SK9vCNvPUi+W0W241ZoMGCIeywGsnixKoRx7DWNxYchcPDWQtoZtrNUwkJBW/Lha
18+
iFMQDdQU7aLYJlwi09KeJB9w7JHNpi4R5N6Kkn0CgYB0jdApOckw/1V+P9xvyiBC
19+
ah8Yfp0Ec9pwy6qwAE750zWXuwSxdcLI64BQdHU4/jJmqdgjpvFHoNG6If7iG6S9
20+
lfdeyCTW37UdiycYgw0kcsgRbLs2f+77iyvjaXvhAe6wl3hx6okjUx/ANnBG8OoO
21+
91F2raDwuhaO92aLFfgpUQKBgAh1t1H4u+vbrEY1fwJzox/t80sLPlOYUqgpccPP
22+
yEBviK7MlKJ6CD5EFnC7E1Fx1e75UXbQJyi/OgAYjXZDXT6GKT08/uUwZ+TV9xN8
23+
wxrBf99Z0PNFX0MnEG/2/zyDxDPGVTVhuh4S+dKOzvaYbXrrxgnChwmmtf+NjoEE
24+
rZkxAoGAQvv6ZrKrhUMYIsgPVyjXe5E421cv/pj4KCsqdeclV+3vR87SwOfpej9y
25+
/gpZuEIHxzzgAz5eFgrGJjm/4VGqNEJ3PGxa6i6a0ld3Cv2j/qyjV8BvL+MtFH1r
26+
X4lEs3tRFn9LSqyeQjfDRP+Fv91OgKaRb6wJ8HWBnx8Jpkd19kU=
27+
-----END RSA PRIVATE KEY-----

ch09/jwt/rsa/key.pub

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPztPWk1Cds9ktLG4c/zLQdANw2wqnB3UvC2CE+V32XSUrp/akM2UljCojSKXwlR8h9YT1Vo70qzFN8G1g/Is7xPPs2T7TgoOWRA4qCkokethN37mJKt7cPrwhUd3EGS7ZUWHnu6oE0kKoYEXQ6BUeH+az1/SQNVppQ1KPuQy7mwtU9ZG+dmDIk3S/8sdLbLba2RedyPvB/2QLXeo3foyxnaofhUXR/z9ZOQTrNRJ1PBjZkS8rrrOOZN+4WhDx1/k3k+PhJNAaT7aXq5T+TE1sE1aNiYk2nUSl0kneb0DWcOtFFB8zUd1yQ4IlWf55gOvMPZb9tIyb/dKCrMzejU41 [email protected]

ch09/jwt/rsa/keypwd

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
Proc-Type: 4,ENCRYPTED
3+
DEK-Info: AES-128-CBC,6B1FF5E922949C8E4AA51B8F5B0F0CBE
4+
5+
E6B7lpXoI0SXOImuBllCOoFPonK6JObMVOp2qrEagcVP9loRXOecRi/qG+nF/BJO
6+
W/FnY4OmsCYAgFPB281plp8eVodNr6XxcPZaQx92G9RlA5FSCWICWFfhOlcDo1bR
7+
1OAkmZjzWve3C2XNbOVpMweO3ElFzKy2KPzuBHaDVfuZm6pMMxqn4C+MzL6cYtF/
8+
a3aJRwRJJYF9OLOSpfoFCCVC/NfOjhczPLgNqRHnpnnAypddwju8R6KPJ1SkZaru
9+
Jd1hwAYzcFY/G21SwCzUp9MOp9faeomWYYiv8BT/65LOY/e8evITh9XDpe83S3KQ
10+
oY+7NiVZdQzjaw8lA9KRWQTsXTLSXAFaHJLmfITr/QnC1HhEPBiux3MY2vjU1QMJ
11+
JtsrlTqBjBIKMJh4RoqvNrcNCCCYaXleNmSObcGR75s41s9yGAaNNKKGfvvPvW5j
12+
69mOEqOmoKdtJuClpkeabqPXVqQLyf3CKZmqZbctmdAytTfZFRSTFw4VZZXKj/nR
13+
7eLPqlg4Q8F057LWlTklsRDZvQOp9Ci5kCFK+5fOQ79CBeBx59i121+tYSpLWos/
14+
bYOKcvSGfDghJYhGgfIg/H2e409VGkum1wTfEjD88n+wsjDQb94a0kiH2Kk/xqoy
15+
Bv24SSIPMgLHuWTJtkUOGESRm1op4URtVBmPURaAAacnXbr6jXyBrl8leN5T394U
16+
hn9Y9iNTTGBDFZL7gqZpSWzW5kI8Ju66Tt1WExlvHlb3h/0doIwlo0+hR6Rs4C4L
17+
2YuOiiV6IBjDPF2ySg2zaUfGSVkxFL85Jrt8yQCLh3ebGeVkOptx653kVm0wMWcy
18+
a8vxTAI4m8szB272ZzMWKf312q83RjRBHPw7dMM6tq9jQL0Aea9/Ia9fLElA8rH/
19+
1i3g4zz3yhTqctkqiKIk7CeMQcYC3IL2ddUHftcijWfjvBChhjvWupegFC2DM29r
20+
H0H5lRyQHT8daaNqWYR9PEL+n8Au/FAgtz4U7lgYVdHstTq7Mch+vnWfc/4Y7pEl
21+
UWZBSmyMl2dpDTGCD79XFgXTuoqtkuML788ll5sz8C0Bh+jVfDwPsc8pimABag/s
22+
0N7l3cPHJX5Vv3lSrVtOdsT7Athhkz4klHijou+a1efDNX+aEbC08oy4M3OaV2Ri
23+
o1yHpvZo9Wsw3IMmxuPswWd42BIweUrLeJy1PuO8dONwi4SzT2RBXIV3H56It9Ad
24+
XQK7BYAtOa1sBJ9tYycP/f9Bfg36SpjxNAwBQkQB9V8nNEDwW4818zQs7aLs5NkM
25+
BMIETlGBSMX+OQTOTNPoABlx+c0Xn6NSm3GpHr5biZOhmShQaDDBdnPV8yk1XQ9j
26+
06tO2LvaevhOVfGt0GuPwUQbOwoJ8dAFFM7A7//2vd/QFEtJKXQK3N2cQTDmvTch
27+
dBt4vpqgiZfwomglHqVw/8NHSIIdTHyVYjCCNQvK7OfjricjBIAMGio+XlNiCbwP
28+
Jpo5fRtZ3bJNLiHIDFYjelWJhSN+B/h0DfSo3XF6roncXC2ljZ07TDi66ju0j80Q
29+
/n5pc2m1ckjjf46tkuSsW6kQN1YBdpzLyyAHeuy9rAR/Vo8inPld7zJa7B4oOuow
30+
-----END RSA PRIVATE KEY-----

ch09/jwt/rsa/keypwd.pub

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAvimJusND8agzuXFhG+d4sPrn6AqC69H/icI77baF15/ztE9b/SioeBl2B+1HI/EnkqMpK8vLJOAN27cHUps9yMkjdU4KrRqK9pjHaeiwxZ+24LVt4QzvT6DcpREymB5y1GX34hIFjcXZDZgV8BkWwVW6qrocLtdl9c4vycPbqAYZ7o/hJzlbmhRClpB1FYamlZhuiH+5neWXuWtN7yV91Pi+DS7l0SbX37ElOComvZy9ug2UVqrK4+mPwCAtxnppHZVQsyVd2l2rKARqE3LRn2mbvlUtInDhfCU12GjRqItbbDgrcKoKeAJrExPUfWc9W3Iknh/2Os0FcbJSr6PX [email protected]

ch09/jwt/tok.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# jwt/tok.py
2+
import jwt
3+
4+
5+
data = {'payload': 'data', 'id': 123456789}
6+
algs = ['HS256', 'HS512']
7+
8+
token = jwt.encode(data, 'secret-key')
9+
data_out = jwt.decode(token, 'secret-key', algorithms=algs)
10+
print(token)
11+
print(data_out)
12+
13+
14+
# decode without verifying the signature
15+
jwt.decode(token, options={'verify_signature': False})
16+
17+
18+
# let's use another algorithm
19+
token512 = jwt.encode(data, 'secret-key', algorithm='HS512')
20+
data_out = jwt.decode(token512, 'secret-key', algorithms=['HS512'])
21+
print(data_out)

ch09/jwt/token_rsa.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# jwt/token_rsa.py
2+
import jwt
3+
from cryptography.hazmat.backends import default_backend
4+
from cryptography.hazmat.primitives import serialization
5+
6+
7+
data = {'payload': 'data'}
8+
9+
10+
def encode(data, priv_filename, algorithm='RS256'):
11+
12+
with open(priv_filename, 'rb') as key:
13+
private_key = key.read()
14+
15+
return jwt.encode(data, private_key, algorithm=algorithm)
16+
17+
18+
def decode(data, pub_filename, algorithm='RS256'):
19+
20+
with open(pub_filename, 'rb') as key:
21+
public_key = key.read()
22+
23+
return jwt.decode(data, public_key, algorithms=[algorithm])
24+
25+
26+
token = encode(data, 'jwt/rsa/key')
27+
data_out = decode(token, 'jwt/rsa/key.pub')
28+
print(data_out)

0 commit comments

Comments
 (0)