mirror of https://github.com/dapr/quickstarts.git
add python-sdk in cryptography (#1093)
Signed-off-by: KentHsu <chiahaohsu9@gmail.com>
This commit is contained in:
parent
c32f421eae
commit
42a99c20a4
|
@ -0,0 +1,74 @@
|
||||||
|
# Dapr cryptography (Dapr SDK)
|
||||||
|
|
||||||
|
In this quickstart, you'll create an application that encrypts, and then decrypts, data using the Dapr cryptography APIs (high-level). We will:
|
||||||
|
|
||||||
|
- Encrypt and then decrypt a short string, reading the result in-memory
|
||||||
|
- Encrypt and then decrypt a large file, storing the encrypted and decrypted data to files
|
||||||
|
|
||||||
|
Visit the documentation to learn more about the [Cryptography building block](https://v1-11.docs.dapr.io/developing-applications/building-blocks/cryptography/) in Dapr.
|
||||||
|
|
||||||
|
> **Note:** This example uses the Dapr SDK. Using the Dapr SDK, which leverages gRPC internally, is **strongly** recommended when using the high-level cryptography APIs (to encrypt and decrypt messages).
|
||||||
|
|
||||||
|
This quickstart includes one application:
|
||||||
|
|
||||||
|
- Python application `crypto-quickstart`
|
||||||
|
|
||||||
|
### Run Python service with Dapr
|
||||||
|
|
||||||
|
> In order to run this sample, make sure that OpenSSL is available on your system.
|
||||||
|
|
||||||
|
1. Navigate into the folder with the source code:
|
||||||
|
|
||||||
|
<!-- STEP
|
||||||
|
name: Navigate into folder
|
||||||
|
expected_stdout_lines:
|
||||||
|
expected_stderr_lines:
|
||||||
|
-->
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ./crypto-quickstart
|
||||||
|
pip3 install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END_STEP -->
|
||||||
|
|
||||||
|
2. This sample requires a private RSA key and a 256-bit symmetric (AES) key. We will generate them using OpenSSL:
|
||||||
|
|
||||||
|
<!-- STEP
|
||||||
|
name: Generate keys
|
||||||
|
working_dir: crypto-quickstart
|
||||||
|
expected_stdout_lines:
|
||||||
|
expected_stderr_lines:
|
||||||
|
-->
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p keys
|
||||||
|
# Generate a private RSA key, 4096-bit keys
|
||||||
|
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out keys/rsa-private-key.pem
|
||||||
|
# Generate a 256-bit key for AES
|
||||||
|
openssl rand -out keys/symmetric-key-256 32
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END_STEP -->
|
||||||
|
|
||||||
|
3. Run the Python service app with Dapr:
|
||||||
|
|
||||||
|
<!-- STEP
|
||||||
|
name: Run order-processor service
|
||||||
|
working_dir: crypto-quickstart
|
||||||
|
expected_stdout_lines:
|
||||||
|
- '== APP == Encrypted the message, got 856 bytes'
|
||||||
|
- '== APP == Decrypted the message, got 24 bytes'
|
||||||
|
- '== APP == The secret is "passw0rd"'
|
||||||
|
- '== APP == Wrote decrypted data to encrypted.out'
|
||||||
|
- '== APP == Wrote decrypted data to decrypted.out.jpg'
|
||||||
|
- "Exited App successfully"
|
||||||
|
expected_stderr_lines:
|
||||||
|
output_match_mode: substring
|
||||||
|
-->
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dapr run --app-id crypto-quickstart --resources-path ../../../components/ -- python3 app.py
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END_STEP -->
|
|
@ -0,0 +1,6 @@
|
||||||
|
# Output files
|
||||||
|
encrypted.out
|
||||||
|
decrypted.out.jpg
|
||||||
|
|
||||||
|
# Generated keys
|
||||||
|
keys/
|
|
@ -0,0 +1,95 @@
|
||||||
|
from dapr.clients import DaprClient
|
||||||
|
from dapr.clients.grpc._crypto import EncryptOptions, DecryptOptions
|
||||||
|
|
||||||
|
# Name of the crypto component to use
|
||||||
|
CRYPTO_COMPONENT_NAME = 'localstorage'
|
||||||
|
# Name of the RSA private key to use
|
||||||
|
RSA_KEY_NAME = 'rsa-private-key.pem'
|
||||||
|
# Name of the symmetric (AES) key to use
|
||||||
|
SYMMETRIC_KEY_NAME = 'symmetric-key-256'
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print('Running gRPC client synchronous API')
|
||||||
|
|
||||||
|
with DaprClient() as dapr:
|
||||||
|
# Step 1: encrypt a string using the RSA key, then decrypt it and show the output in the terminal
|
||||||
|
print('Running encrypt/decrypt operation on string')
|
||||||
|
encrypt_decrypt_string(dapr)
|
||||||
|
|
||||||
|
# Step 2: encrypt a large file and then decrypt it, using the AES key
|
||||||
|
print('Running encrypt/decrypt operation on file')
|
||||||
|
encrypt_decrypt_file(dapr)
|
||||||
|
|
||||||
|
|
||||||
|
def encrypt_decrypt_string(dapr: DaprClient):
|
||||||
|
message = 'The secret is "passw0rd"'
|
||||||
|
|
||||||
|
# Encrypt the message
|
||||||
|
resp = dapr.encrypt(
|
||||||
|
data=message.encode(),
|
||||||
|
options=EncryptOptions(
|
||||||
|
component_name=CRYPTO_COMPONENT_NAME,
|
||||||
|
key_name=RSA_KEY_NAME,
|
||||||
|
key_wrap_algorithm='RSA',
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
# The method returns a readable stream, which we read in full in memory
|
||||||
|
encrypt_bytes = resp.read()
|
||||||
|
print(f'Encrypted the message, got {len(encrypt_bytes)} bytes')
|
||||||
|
|
||||||
|
# Decrypt the encrypted data
|
||||||
|
resp = dapr.decrypt(
|
||||||
|
data=encrypt_bytes,
|
||||||
|
options=DecryptOptions(
|
||||||
|
component_name=CRYPTO_COMPONENT_NAME,
|
||||||
|
key_name=RSA_KEY_NAME,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
# The method returns a readable stream, which we read in full in memory
|
||||||
|
decrypt_bytes = resp.read()
|
||||||
|
print(f'Decrypted the message, got {len(decrypt_bytes)} bytes')
|
||||||
|
|
||||||
|
print(decrypt_bytes.decode())
|
||||||
|
assert message == decrypt_bytes.decode()
|
||||||
|
|
||||||
|
|
||||||
|
def encrypt_decrypt_file(dapr: DaprClient):
|
||||||
|
file_name = 'desert.jpg'
|
||||||
|
|
||||||
|
# Encrypt the file
|
||||||
|
with open(file_name, 'r+b') as target_file:
|
||||||
|
encrypt_stream = dapr.encrypt(
|
||||||
|
data=target_file.read(),
|
||||||
|
options=EncryptOptions(
|
||||||
|
component_name=CRYPTO_COMPONENT_NAME,
|
||||||
|
key_name=SYMMETRIC_KEY_NAME,
|
||||||
|
key_wrap_algorithm='AES',
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
# Write the encrypted data to a file "encrypted.out"
|
||||||
|
with open('encrypted.out', 'w+b') as encrypted_file:
|
||||||
|
encrypted_file.write(encrypt_stream.read())
|
||||||
|
print('Wrote encrypted data to encrypted.out')
|
||||||
|
|
||||||
|
# Decrypt the encrypted data
|
||||||
|
with open('encrypted.out', 'r+b') as encrypted_file:
|
||||||
|
decrypt_stream = dapr.decrypt(
|
||||||
|
data=encrypted_file.read(),
|
||||||
|
options=DecryptOptions(
|
||||||
|
component_name=CRYPTO_COMPONENT_NAME,
|
||||||
|
key_name=SYMMETRIC_KEY_NAME,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
# Write the decrypted data to a file "decrypted.out.jpg"
|
||||||
|
with open('decrypted.out.jpg', 'w+b') as decrypted_file:
|
||||||
|
decrypted_file.write(decrypt_stream.read())
|
||||||
|
print('Wrote decrypted data to decrypted.out.jpg')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
Binary file not shown.
After Width: | Height: | Size: 5.7 MiB |
|
@ -0,0 +1,2 @@
|
||||||
|
dapr>=1.13.0a,<1.14.0
|
||||||
|
typing-extensions
|
|
@ -0,0 +1,9 @@
|
||||||
|
include ../../../docker.mk
|
||||||
|
include ../../../validate.mk
|
||||||
|
|
||||||
|
# Remove generated files
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
-rm -r crypto-quickstart/keys
|
||||||
|
-rm crypto-quickstart/encrypted.out
|
||||||
|
-rm crypto-quickstart/decrypted.out.jpg
|
Loading…
Reference in New Issue