Я пытаюсь проверить пользователя по имени пользователя и сохраненному зашифрованному паролю, первая лямбда-функция выдает ошибку, поскольку тип не должен быть двоичным, однако во второй лямбда-функции, которую я использовал для сохранения имени пользователя и пароля, если я пытаюсь расшифровать то же самое работает. Я передаю одни и те же аргументы в обеих функциях, однако одна работает, а другая нет, оба обращаются к одной и той же таблице DynamoDB. Я не знаю, как проверить, какой тип данных «секретный» поддерживает, согласно сообщению об ошибке, объектоподобные байты или строку ASCII. Пароль после шифрования сохраняется как двоичный файл в таблице, которая автоматически создается функцией, и тип не был определен вручную.
Я попытался импортировать binascii и преобразовать "password_from_table = binascii.b2a_base64 (password_from_table) "и я получил следующую ошибку.
Response:
{
"errorMessage": "a bytes-like object is required, not 'Binary'",
"errorType": "TypeError",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 37, in lambda_handler\n password_from_table = binascii.b2a_base64(password_from_table)\n"
]
}
import boto3
import base64
from boto3.dynamodb.conditions import Key, Attr
def decrypt(session, secret):
client = session.client('kms')
plaintext = client.decrypt(
CiphertextBlob=(base64.b64decode(secret))
)
return plaintext["Plaintext"]
def lambda_handler(event, context):
session = boto3.session.Session()
dynamodb = boto3.resource('dynamodb')
authentication_table_name = 'Authorization'
#authorization_table = dynamodb.Table('GE_redo_authorization')
authentication_table = dynamodb.Table(authentication_table_name)
password = event['password']
username = event['username']
# Authenticate user with encrypted DDB
entry = authentication_table.get_item(TableName=authentication_table_name, Key={'username':username})
if 'Item' in entry:
password_from_table = entry['Item']['password']
decrypted_password_from_table = decrypt(session,password_from_table)
decrypted_password_from_table = decrypted_password_from_table.decode('utf-8')
if password == decrypted_password_from_table:
return 'Correct password'
else:
return 'Incorrect password'
else:
return 'Invalid User'
Response:
{
"errorMessage": "argument should be a bytes-like object or ASCII string, not 'Binary'",
"errorType": "TypeError",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 36, in lambda_handler\n decrypted_password_from_table = decrypt(session,password_from_table)\n",
" File \"/var/task/lambda_function.py\", line 10, in decrypt\n CiphertextBlob=(base64.b64decode(secret))\n",
" File \"/var/lang/lib/python3.8/base64.py\", line 80, in b64decode\n s = _bytes_from_decode_data(s)\n",
" File \"/var/lang/lib/python3.8/base64.py\", line 45, in _bytes_from_decode_data\n raise TypeError(\"argument should be a bytes-like object or ASCII \"\n"
]
}
import boto3
import base64
from botocore.exceptions import ClientError
def encrypt(session, secret, alias):
client = session.client('kms')
ciphertext = client.encrypt(
KeyId=alias,
Plaintext=(secret),
)
return base64.b64encode(ciphertext["CiphertextBlob"])
def lambda_handler(event, context):
plain_text_password = event['password']
username = event['username']
key_alias = 'alias/ProjectKey'
table_name = 'Authorization'
session = boto3.session.Session()
table = boto3.resource('dynamodb').Table(table_name)
encrypted_password = encrypt(session, plain_text_password, key_alias)
decrypted_password = decrypt(session, encrypted_password)
item = {
'username':username,
'password':encrypted_password
}
#check if item with the username already exists; if so, update password; else create new item
entry = table.get_item(TableName=table_name, Key={'username':username})
# if an entry with that username already exists, then update its corresponding password
if 'Item' in entry:
print("entry['Item']" + str(entry['Item']))
response = table.update_item(
Key={
'username': username
},
UpdateExpression="set password = :p",
ExpressionAttributeValues={
':p': encrypted_password
},
ReturnValues="UPDATED_NEW"
)
else:
#if an entry with that username doesn't already exist, then create it
table.put_item(Item=item)
new_entry = table.get_item(TableName=table_name, Key={'username':username})
decrypted_password = decrypt(session, encrypted_password)
return decrypted_password
def decrypt(session, secret):
client = session.client('kms')
plaintext = client.decrypt(
CiphertextBlob=(base64.b64decode(secret))
)
return plaintext["Plaintext"]
Response:
"password"