Учебники

Python Forensics — Краткое руководство

Python Forensics — Введение

Python — это язык программирования общего назначения с простым читаемым кодом, который может быть легко понят как профессиональными разработчиками, так и начинающими программистами. Python включает в себя множество полезных библиотек, которые можно использовать с любой структурой стека. Многие лаборатории полагаются на Python для создания базовых моделей для предсказаний и проведения экспериментов. Это также помогает контролировать критические операционные системы.

Python имеет встроенные возможности для поддержки цифрового расследования и защиты целостности улик во время расследования. В этом уроке мы объясним основные принципы применения Python в цифровой или компьютерной экспертизе.

Что такое компьютерная криминалистика?

Вычислительная криминалистика является новой областью исследований. Он занимается решением судебно-медицинских проблем с использованием цифровых методов. Он использует вычислительную науку для изучения цифровых доказательств.

Вычислительная криминалистика включает в себя широкий круг предметов, в которых исследуются объекты, вещества и процессы, в основном на основе фактических данных, таких как метки инструментов, отпечатки пальцев, отпечатки обуви, документы и т. Д., А также включает физиологические и поведенческие паттерны, ДНК и цифровые доказательства в места преступления.

Следующая диаграмма показывает широкий спектр предметов, охватываемых компьютерной экспертизы.

Вычислительная криминалистика

Вычислительная криминалистика реализована с помощью некоторых алгоритмов. Эти алгоритмы используются для обработки сигналов и изображений, компьютерного зрения и графики. Сюда также входит интеллектуальный анализ данных, машинное обучение и робототехника.

Вычислительная криминалистика использует разнообразные цифровые методы. Лучшее решение для упрощения всех цифровых методов в криминалистике — это использование языка программирования общего назначения, такого как Python.

Python Forensics — Установка Python

Поскольку нам нужен Python для всех видов вычислительной экспертизы, давайте шаг за шагом перейдем к пониманию того, как его установить.

Шаг 1 — Перейдите на https://www.python.org/downloads/ и загрузите установочные файлы Python в соответствии с операционной системой, установленной в вашей системе.

Скачать установочные файлы

Шаг 2 — После загрузки пакета / установщика, нажмите на исполняемый файл, чтобы начать процесс установки.

Начать установку

После завершения установки вы увидите следующий экран.

Установка завершена

Шаг 3 — Следующий шаг — установить переменные окружения Python в вашей системе.

Установить переменные среды

Шаг 4 — После того, как переменные среды заданы, введите в командной строке команду «python», чтобы проверить, была ли установка успешной или нет.

Если установка прошла успешно, вы получите следующий вывод на консоль.

Установочный выход

Python Forensics — Обзор Python

Коды, написанные на Python, выглядят очень похоже на коды, написанные на других традиционных языках программирования, таких как C или Pascal. Также сказано, что синтаксис Python заимствован из C. Это включает в себя многие из ключевых слов Python, которые похожи на язык C.

Python включает в себя условные и циклические операторы, которые можно использовать для точного извлечения данных для криминалистики. Для управления потоком он предоставляет if / else , while и высокоуровневый оператор for, который зацикливается на любом «итерируемом» объекте.

if a < b: 
   max = b 
else: 
   max = a

Основная область, в которой Python отличается от других языков программирования, заключается в использовании динамической типизации . Он использует имена переменных, которые ссылаются на объекты. Эти переменные не должны быть объявлены.

Типы данных

Python включает в себя набор встроенных типов данных, таких как строки, логические значения, числа и т. Д. Существуют также неизменяемые типы, то есть значения, которые нельзя изменить во время выполнения.

Python также имеет составные встроенные типы данных, которые включают в себя кортежи, которые являются неизменяемыми массивами, списками и словарями, которые являются хеш-таблицами. Все они используются в цифровой криминалистике для хранения ценностей при сборе доказательств.

Сторонние модули и пакеты

Python поддерживает группы модулей и / или пакетов, которые также называются сторонними модулями (связанный код, сгруппированный в одном исходном файле), которые используются для организации программ.

Python включает в себя обширную стандартную библиотеку, которая является одной из основных причин его популярности в компьютерной экспертизе.

Жизненный цикл кода Python

  • Сначала, когда вы выполняете код Python, интерпретатор проверяет код на наличие синтаксических ошибок. Если интерпретатор обнаруживает какие-либо синтаксические ошибки, они немедленно отображаются в виде сообщений об ошибках.

  • Если синтаксических ошибок нет, код компилируется для создания байт-кода и отправляется в PVM (виртуальная машина Python).

  • PVM проверяет байт-код на наличие ошибок времени выполнения или логических ошибок. В случае, если PVM обнаружит какие-либо ошибки во время выполнения, они немедленно сообщаются как сообщения об ошибках.

  • Если байт-код не содержит ошибок, то код обрабатывается, и вы получаете его вывод.

Сначала, когда вы выполняете код Python, интерпретатор проверяет код на наличие синтаксических ошибок. Если интерпретатор обнаруживает какие-либо синтаксические ошибки, они немедленно отображаются в виде сообщений об ошибках.

Если синтаксических ошибок нет, код компилируется для создания байт-кода и отправляется в PVM (виртуальная машина Python).

PVM проверяет байт-код на наличие ошибок времени выполнения или логических ошибок. В случае, если PVM обнаружит какие-либо ошибки во время выполнения, они немедленно сообщаются как сообщения об ошибках.

Если байт-код не содержит ошибок, то код обрабатывается, и вы получаете его вывод.

На следующем рисунке графически показано, как код Python сначала интерпретируется для создания байт-кода и как байт-код обрабатывается PVM для получения выходных данных.

Жизненный цикл кода Python

Python Forensics — Основное судебное приложение

Для создания приложения в соответствии с правилами судебной экспертизы важно понимать и следовать его соглашениям и шаблонам именования.

Соглашения об именах

При разработке приложений для экспертизы Python правила и соглашения, которые необходимо соблюдать, описаны в следующей таблице.

Константы Прописные буквы с подчеркиванием ВЫСОКАЯ ТЕМПЕРАТУРА
Имя локальной переменной Строчные буквы с неровными колпачками (подчеркивание не обязательно) currentTemperature
Имя глобальной переменной Префикс gl в нижнем регистре с ухабистыми заглавными буквами (подчеркивание не обязательно) gl_maximumRecordedTemperature
Название функции Верхний регистр с ухабистыми заглавными буквами (подчеркивание необязательно) с активным голосом ConvertFarenheitToCentigrade (…)
Имя объекта Приставка ob_ строчная с ухабистыми заглавными буквами ob_myTempRecorder
модуль Подчеркивание, за которым следует строчная буква с неровными колпачками _tempRecorder
Имена классов Префикс class_, затем неровные заглавные буквы и краткий class_TempSystem

Давайте рассмотрим сценарий, чтобы понять важность соглашений об именах в вычислительной экспертизе. Предположим, у нас есть алгоритм хеширования, который обычно используется для шифрования данных. Алгоритм одностороннего хеширования принимает входные данные в виде потока двоичных данных; это может быть пароль, файл, двоичные данные или любые цифровые данные. Затем алгоритм хеширования создает дайджест сообщения (md) в отношении данных, полученных на входе.

Практически невозможно создать новый двоичный вход, который будет генерировать данный дайджест сообщения. Даже один бит двоичных входных данных, если он будет изменен, будет генерировать уникальное сообщение, которое отличается от предыдущего.

пример

Взгляните на следующий пример программы, которая следует вышеупомянутым соглашениям.

import sys, string, md5   # necessary libraries
print "Please enter your full name"
line = sys.stdin.readline()
line = line.rstrip()
md5_object = md5.new()
md5_object.update(line)
print md5_object.hexdigest()   # Prints the output as per the hashing algorithm i.e. md5
exit

Вышеуказанная программа производит следующий вывод.

Пример соглашения об именах

В этой программе скрипт Python принимает входные данные (ваше полное имя) и преобразует их в соответствии с алгоритмом хеширования md5. Он шифрует данные и защищает информацию, если требуется. В соответствии с правилами судебно-медицинской экспертизы, в этом шаблоне может быть обеспечено название доказательств или любых других доказательств.

Python Forensics — хэш-функция

Хеш-функция определяется как функция, которая отображает большой объем данных на фиксированное значение заданной длины. Эта функция гарантирует, что один и тот же вход приводит к одному и тому же выводу, который фактически определяется как хэш-сумма. Хэш-сумма включает в себя характеристику с конкретной информацией.

Эту функцию практически невозможно вернуть. Таким образом, любая сторонняя атака, такая как атака грубой силы, практически невозможна. Также этот вид алгоритма называется односторонним криптографическим алгоритмом .

Идеальная криптографическая хеш-функция имеет четыре основных свойства —

  • Должно быть легко вычислить значение хеша для любого заданного ввода.
  • Должно быть невозможно генерировать исходный ввод из его хеша.
  • Должно быть невозможно изменить вход без изменения хэша.
  • Должно быть невозможно найти два разных входа с одинаковым хешем.

пример

Рассмотрим следующий пример, который помогает сопоставлять пароли с использованием символов в шестнадцатеричном формате.

import uuid
import hashlib
  
def hash_password(password):
   # userid is used to generate a random number
   salt = uuid.uuid4().hex #salt is stored in hexadecimal value
   return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt
     
def check_password(hashed_password, user_password):
   # hexdigest is used as an algorithm for storing passwords
   password, salt = hashed_password.split(':')
   return password == hashlib.sha256(salt.encode()
      + user_password.encode()).hexdigest()

new_pass = raw_input('Please enter required password ')
hashed_password = hash_password(new_pass)
print('The string to store in the db is: ' + hashed_password)
old_pass = raw_input('Re-enter new password ')

if check_password(hashed_password, old_pass):
   print('Yuppie!! You entered the right password')
else:
   print('Oops! I am sorry but the password does not match')

блок-схема

Мы объяснили логику этой программы с помощью следующей блок-схемы —

Блок-схема хэш-функции

Выход

Наш код выдаст следующий результат:

Выход хэш-функции

Дважды введенный пароль соответствует хэш-функции. Это гарантирует, что пароль, введенный дважды, является точным, что помогает собирать полезные данные и сохранять их в зашифрованном формате.

Python Forensics — взломать шифрование

В этой главе мы узнаем о взломе текстовых данных, полученных во время анализа и доказательств.

Обычный текст в криптографии — это обычный читаемый текст, такой как сообщение. С другой стороны, зашифрованный текст — это вывод алгоритма шифрования, полученный после ввода простого текста.

Простым алгоритмом превращения обычного текстового сообщения в зашифрованный текст является шифр Цезаря, изобретенный Юлием Цезарем для защиты открытого текста от его врагов. Этот шифр предполагает смещение каждой буквы в сообщении «вперед» на три позиции в алфавите.

Ниже приведена демонстрационная иллюстрация.

а → д

b → E

с → F

….

w → Z

x → A

y → B

z → C

пример

Сообщение, вводимое при запуске скрипта Python, предоставляет все возможности символов, которые используются для подтверждения шаблона.

Типы использованных доказательств:

  • Следы шин и знаки
  • Впечатления
  • Отпечатки

Каждые биометрические данные состоят из векторных данных, которые нам необходимо взломать, чтобы собрать доказательства в полном объеме.

Следующий код Python показывает, как вы можете создать зашифрованный текст из простого текста —

import sys

def decrypt(k,cipher): 
   plaintext = '' 
   
   for each in cipher: 
      p = (ord(each)-k) % 126 
      
      if p < 32: 
         p+=95 
         plaintext += chr(p) 
         print plaintext 

def main(argv):
   if (len(sys.argv) != 1): 
      sys.exit('Usage: cracking.py') 
      cipher = raw_input('Enter message: ') 
      
      for i in range(1,95,1): 
         decrypt(i,cipher)
         
if __name__ == "__main__": 
   main(sys.argv[1:])

Выход

Теперь проверьте вывод этого кода. Когда мы вводим простой текст «Радхика», программа выдаст следующий зашифрованный текст.

Шифрование на выходе

Python Forensics — Виртуализация

Виртуализация — это процесс эмуляции ИТ-систем, таких как серверы, рабочие станции, сети и хранилище. Это не что иное, как создание виртуальной, а не фактической версии любой операционной системы, сервера, устройства хранения или сетевых процессов.

Основной компонент, который помогает в эмуляции виртуального оборудования, определяется как гипервизор .

На следующем рисунке показаны два основных типа используемой виртуализации системы.

Типы виртуализации

Виртуализация использовалась в компьютерной экспертизе рядом способов. Это помогает аналитику таким образом, что рабочая станция может использоваться в проверенном состоянии для каждого исследования. Восстановление данных возможно, если подключить образ виртуальной машины как дополнительный диск к виртуальной машине. Эта же машина может быть использована в качестве программного обеспечения для сбора доказательств.

Следующий пример помогает понять создание виртуальной машины с помощью языка программирования Python.

Шаг 1 — Пусть виртуальная машина будет иметь имя «dummy1».

Каждая виртуальная машина должна иметь 512 МБ памяти в минимальном объеме, выраженном в байтах.

vm_memory = 512 * 1024 * 1024

Шаг 2. Виртуальная машина должна быть подключена к кластеру по умолчанию, который был рассчитан.

vm_cluster = api.clusters.get(name = "Default")

Шаг 3 — Виртуальная машина должна загружаться с виртуального жесткого диска.

vm_os = params.OperatingSystem(boot = [params.Boot(dev = "hd")])

Все параметры объединяются в объект параметров виртуальной машины, прежде чем использовать метод add коллекции vms для виртуальной машины.

пример

Ниже приведен полный скрипт Python для добавления виртуальной машины.

from ovirtsdk.api import API #importing API library
from ovirtsdk.xml import params

try: #Api credentials is required for virtual machine
   api = API(url = "https://HOST", 
      username = "Radhika", 
      password = "a@123", 
      ca_file = "ca.crt")
      
   vm_name = "dummy1"
   vm_memory = 512 * 1024 * 1024 #calculating the memory in bytes
   vm_cluster = api.clusters.get(name = "Default")
   vm_template = api.templates.get(name = "Blank")
   
   #assigning the parameters to operating system
   vm_os = params.OperatingSystem(boot = [params.Boot(dev = "hd")])
   
   vm_params = params.VM(name = vm_name,
      memory = vm_memory,
      cluster = vm_cluster,
      template = vm_template
      os = vm_os)

   try: 
      api.vms.add(vm = vm_params) 
      print "Virtual machine '%s' added." % vm_name #output if it is successful. 
   except Exception as ex: 
      print "Adding virtual machine '%s' failed: %s" % (vm_name, ex) 
      api.disconnect()
      
except Exception as ex: 
   print "Unexpected error: %s" % ex

Выход

Наш код выдаст следующий результат:

Выход виртуализации

Python Forensics — Сетевая криминалистика

Сценарий современных сетевых сред таков, что расследование может быть сопряжено с рядом трудностей. Это может произойти независимо от того, реагируете ли вы на поддержку нарушения, исследуете инсайдерские действия, выполняете оценки, связанные с уязвимостью, или проверяете соответствие нормативным требованиям.

Концепция сетевого программирования

Следующие определения используются в сетевом программировании.

  • Клиент — Клиент является частью клиент-серверной архитектуры сетевого программирования, которая работает на персональном компьютере и рабочей станции.

  • Сервер — сервер является частью клиент-серверной архитектуры, которая предоставляет услуги другим компьютерным программам на том же или других компьютерах.

  • WebSockets — WebSockets предоставляют протокол между клиентом и сервером, который работает через постоянное TCP-соединение. Благодаря этому двунаправленные сообщения могут передаваться между сокетами TCP (одновременно).

Клиент — Клиент является частью клиент-серверной архитектуры сетевого программирования, которая работает на персональном компьютере и рабочей станции.

Сервер — сервер является частью клиент-серверной архитектуры, которая предоставляет услуги другим компьютерным программам на том же или других компьютерах.

WebSockets — WebSockets предоставляют протокол между клиентом и сервером, который работает через постоянное TCP-соединение. Благодаря этому двунаправленные сообщения могут передаваться между сокетами TCP (одновременно).

WebSockets следуют за многими другими технологиями, которые позволяют серверам отправлять информацию клиенту. Помимо рукопожатия заголовка обновления, WebSockets не зависит от HTTP.

Сетевое программирование

Эти протоколы используются для проверки информации, которую отправляют или получают сторонние пользователи. Поскольку шифрование является одним из методов, используемых для защиты сообщений, также важно защитить канал, по которому сообщения были переданы.

Рассмотрим следующую программу на Python, которую клиент использует для рукопожатия .

пример

# client.py
import socket

# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# get local machine name
host = socket.gethostname()
port = 8080

# connection to hostname on the port.
s.connect((host, port))

# Receive no more than 1024 bytes
tm = s.recv(1024)
print("The client is waiting for connection")
s.close()

Выход

Это даст следующий результат —

Выход сетевого программирования

Сервер, принимающий запрос на канал связи, будет содержать следующий скрипт.

# server.py
import socket
import time

# create a socket object
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# get local machine name 
host = socket.gethostname()
port = 8080

# bind to the port
serversocket.bind((host, port))

# queue up to 5 requests 
serversocket.listen(5)

while True:
   # establish a connection 
   clientsocket,addr = serversocket.accept()
   print("Got a connection from %s" % str(addr))
   currentTime = time.ctime(time.time()) + "\r\n"
   clientsocket.send(currentTime.encode('ascii'))
   clientsocket.close()

Клиент и сервер, созданные с помощью программирования Python, прослушивают номер хоста. Первоначально клиент отправляет запрос на сервер в отношении данных, отправленных на номер хоста, и сервер принимает запрос и немедленно отправляет ответ. Таким образом, мы можем иметь безопасный канал связи.

Python Forensics — модули Python

Модули в программах Python помогают в организации кода. Они помогают группировать связанный код в единый модуль, что облегчает его понимание и использование. Он включает в себя произвольно названные значения, которые можно использовать для привязки и ссылки. Проще говоря, модуль — это файл, состоящий из кода Python, который включает функции, классы и переменные.

Код Python для модуля (файла) сохраняется с расширением .py, которое компилируется по мере необходимости.

пример

def print_hello_func( par ): 
   print "Hello : ", par 
   return

Импорт заявления

Исходный файл Python можно использовать как модуль, выполнив инструкцию import, которая импортирует другие пакеты или сторонние библиотеки. Синтаксис используется следующим образом —

import module1[, module2[,... moduleN]

Когда интерпретатор Python встречает оператор импорта, он импортирует указанный модуль, который присутствует в пути поиска.

пример

Рассмотрим следующий пример.

#!/usr/bin/python

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Radhika")

Это даст следующий результат —

Модуль вывода

Модуль загружается только один раз, независимо от того, сколько раз он был импортирован кодом Python.

От … заявление на импорт

Атрибут From помогает импортировать определенные атрибуты из модуля в текущее пространство имен. Вот его синтаксис.

from modname import name1[, name2[, ... nameN]]

пример

Чтобы импортировать функцию fibonacci из модуля fib , используйте следующую инструкцию.

from fib import fibonacci

Расположение модулей

Когда модуль импортируется, интерпретатор Python ищет следующие последовательности:

  • Текущий каталог.

  • Если модуль не существует, Python ищет каждый каталог в переменной оболочки PYTHONPATH.

  • Если не удается найти переменную оболочки, Python проверяет путь по умолчанию.

Текущий каталог.

Если модуль не существует, Python ищет каждый каталог в переменной оболочки PYTHONPATH.

Если не удается найти переменную оболочки, Python проверяет путь по умолчанию.

Вычислительная криминалистика использует модули Python и сторонние модули для получения информации и более легкого извлечения доказательств. Дальнейшие главы посвящены реализации модулей для получения необходимого результата.

Python Forensics — Dshell и Scapy

DSHELL

Dshell — это набор инструментов для криминалистического анализа на основе Python. Этот инструментарий был разработан Исследовательской лабораторией армии США. Выпуск этого набора инструментов с открытым исходным кодом был в 2014 году. Основным направлением этого набора инструментов является легкое проведение судебных расследований.

Инструментарий состоит из большого количества декодеров, которые перечислены в следующей таблице.

Sr.No. Название и описание декодера
1

DNS

Это используется для извлечения связанных с DNS запросов

2

reservedips

Определяет решения для проблем DNS

3

большие потоки

Распечатка сетевых потоков

4

рипы-клиент

Используется извлечение файлов из HTTP-трафика

5

протоколы

Используется для идентификации нестандартных протоколов

DNS

Это используется для извлечения связанных с DNS запросов

reservedips

Определяет решения для проблем DNS

большие потоки

Распечатка сетевых потоков

рипы-клиент

Используется извлечение файлов из HTTP-трафика

протоколы

Используется для идентификации нестандартных протоколов

Лаборатория армии США поддерживает хранилище клонов в GitHub по следующей ссылке —

https://github.com/USArmyResearchLab/Dshell

Репозиторий клонов

Клон состоит из сценария install-ubuntu.py (), который используется для установки этого инструментария.

После успешной установки он автоматически создаст исполняемые файлы и зависимости, которые будут использованы позже.

Зависимости следующие:

dependencies = { 
   "Crypto": "crypto", 
   "dpkt": "dpkt", 
   "IPy": "ipy", 
   "pcap": "pypcap" 
}

Этот инструментарий можно использовать для файлов pcap (захвата пакетов), которые обычно записываются во время инцидентов или во время оповещения. Эти файлы pcap создаются либо libpcap на платформе Linux, либо WinPcap на платформе Windows.

Scapy

Scapy — это инструмент на основе Python, используемый для анализа и управления сетевым трафиком. Ниже приведена ссылка на набор инструментов Scapy —

http://www.secdev.org/projects/scapy/

Этот инструментарий используется для анализа манипулирования пакетами. Он очень способен декодировать пакеты широкого спектра протоколов и захватывать их. Scapy отличается от инструментария Dshell тем, что предоставляет подробное описание для сетевого трафика. Эти описания были записаны в режиме реального времени.

Scapy имеет возможность черчения с использованием сторонних инструментов или снятия отпечатков ОС.

Рассмотрим следующий пример.

import scapy, GeoIP #Imports scapy and GeoIP toolkit 
from scapy import * 
geoIp = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE) #locates the Geo IP address 
def locatePackage(pkg): 
src = pkg.getlayer(IP).src #gets source IP address 
dst = pkg.getlayer(IP).dst #gets destination IP address 
srcCountry = geoIp.country_code_by_addr(src) #gets Country details of source 
dstCountry = geoIp.country_code_by_addr(dst) #gets country details of destination 
print src+"("+srcCountry+") >> "+dst+"("+dstCountry+")\n"

Этот сценарий дает подробное описание сведений о стране в сетевом пакете, которые общаются друг с другом.

Приведенный выше скрипт выдаст следующий вывод.

DShell и Scapy Output

Python Forensics — Поиск

Поиск , безусловно, является одним из столпов судебно-медицинской экспертизы. В настоящее время поиск эффективен только для следователя, который проводит улики.

Поиск ключевого слова из сообщения играет важную роль в криминалистике, когда мы ищем доказательства с помощью ключевого слова. Знание того, что нужно искать в определенном файле вместе с тем, что находится в удаленных файлах, требует как опыта, так и знаний.

Python имеет различные встроенные механизмы со стандартными библиотечными модулями для поддержки поиска . По сути, следователи используют операцию поиска, чтобы найти ответы на такие вопросы, как «кто», «что», «где», «когда» и т. Д.

пример

В следующем примере мы объявили две строки, а затем мы использовали функцию find, чтобы проверить, содержит ли первая строка вторую строку или нет.

# Searching a particular word from a message
str1 = "This is a string example for Computational forensics of gathering evidence!";
str2 = "string";

print str1.find(str2)
print str1.find(str2, 10)
print str1.find(str2, 40)

Приведенный выше скрипт выдаст следующий вывод.

Результаты поиска

Функция «найти» в Python помогает в поиске ключевого слова в сообщении или абзаце. Это очень важно для сбора соответствующих доказательств.

Python Forensics — Индексирование

Индексирование фактически дает исследователю возможность полностью изучить файл и собрать из него потенциальные доказательства. Доказательства могут содержаться в файле, образе диска, снимке памяти или трассировке сети.

Индексирование помогает сократить время выполнения трудоемких задач, таких как поиск по ключевым словам . Криминалистическое расследование также включает в себя этап интерактивного поиска, где индекс используется для быстрого поиска ключевых слов.

Индексирование также помогает в перечислении ключевых слов в отсортированном списке.

пример

В следующем примере показано, как вы можете использовать индексирование в Python.

aList = [123, 'sample', 'zara', 'indexing'];

print "Index for sample : ", aList.index('sample')
print "Index for indexing : ", aList.index('indexing')

str1 = "This is sample message for forensic investigation indexing";
str2 = "sample";

print "Index of the character keyword found is " 
print str1.index(str2)

Приведенный выше скрипт выдаст следующий вывод.

Индексирование вывода

Python Forensics — Библиотека изображений Python

Извлечение ценной информации из доступных ресурсов является важной частью цифровой криминалистики. Получение доступа ко всей доступной информации имеет важное значение для процесса расследования, поскольку оно помогает в получении соответствующих доказательств.

Ресурсы, которые содержат данные, могут быть простыми структурами данных, такими как базы данных, или сложными структурами данных, такими как изображение JPEG. К простым структурам данных можно легко получить доступ с помощью простых инструментов рабочего стола, а для извлечения информации из сложных структур данных требуются сложные инструменты программирования.

Библиотека изображений Python

Библиотека изображений Python (PIL) добавляет возможности обработки изображений для вашего интерпретатора Python. Эта библиотека поддерживает множество форматов файлов и предоставляет мощные возможности обработки изображений и графики. Вы можете скачать исходные файлы PIL с: http://www.pythonware.com/products/pil/

На следующем рисунке показана полная схема извлечения данных из изображений (сложных структур данных) в PIL.

Библиотека изображений Python

пример

Теперь давайте разберем пример программирования, чтобы понять, как он на самом деле работает.

Шаг 1 — Предположим, у нас есть следующее изображение, откуда мы должны извлечь информацию.

Библиотека изображений Python Step1

Шаг 2 — Когда мы открываем это изображение с помощью PIL, оно сначала отметит необходимые точки, необходимые для извлечения свидетельства, которое включает в себя различные значения пикселей. Вот код для открытия изображения и записи его значений пикселей —

from PIL import Image
im = Image.open('Capture.jpeg', 'r')
pix_val = list(im.getdata())
pix_val_flat = [x for sets in pix_val for x in sets]
print pix_val_flat

Шаг 3 — Наш код выдаст следующий результат после извлечения значений пикселей изображения.

Библиотека изображений Python Step3

Выходные данные представляют значения пикселей в комбинации RGB, которые дают лучшее представление о том, какие данные необходимы для доказательства. Извлеченные данные представлены в виде массива.

Python Forensics — Мобильная криминалистика

Судебно-медицинская экспертиза и анализ стандартного компьютерного оборудования, такого как жесткие диски, превратились в стабильную дисциплину, и за ней следуют методы анализа нестандартного оборудования или временных данных.

Хотя смартфоны все чаще используются в цифровых расследованиях, они все еще считаются нестандартными.

Судебный анализ

Судебные расследования осуществляют поиск данных, таких как принятые звонки или набранные номера со смартфона. Он может включать текстовые сообщения, фотографии или любые другие улики. Большинство смартфонов имеют функции блокировки экрана с помощью паролей или буквенно-цифровых символов.

Здесь мы возьмем пример, чтобы показать, как Python может помочь взломать пароль блокировки экрана для получения данных со смартфона.

Ручное обследование

Android поддерживает блокировку паролем с помощью PIN-кода или буквенно-цифрового пароля. Предел обеих паролей должен быть от 4 до 16 цифр или символов. Пароль смартфона хранится в системе Android в специальном файле с именем password.key в / data / system .

Android хранит соленые SHA1-хэш-суммы и MD5-хэш-суммы паролей. Эти пароли могут быть обработаны в следующем коде.

public byte[] passwordToHash(String password) {

   if (password == null) { 
      return null; 
   }

   String algo = null;
   byte[] hashed = null;

   try { 
      byte[] saltedPassword = (password + getSalt()).getBytes(); 
      byte[] sha1 = MessageDigest.getInstance(algo = "SHA-1").digest(saltedPassword);
      byte[] md5 = MessageDigest.getInstance(algo = "MD5").digest(saltedPassword); 
      hashed = (toHex(sha1) + toHex(md5)).getBytes(); 
   } catch (NoSuchAlgorithmException e) { 
      Log.w(TAG, "Failed to encode string because of missing algorithm: " + algo); 
   }
   
   return hashed;
}

Взломать пароль с помощью атаки по словарю невозможно, так как хешированный пароль хранится в солт-файле . Эта соль представляет собой строку шестнадцатеричного представления случайного целого числа из 64 бит. Легко получить доступ к соли с помощью Rooted Smartphone или JTAG Adapter .

Рутованный смартфон

Дамп файла /data/system/password.key хранится в базе данных SQLite под ключом lockscreen.password_salt . В файле settings.db пароль сохраняется, и значение четко видно на следующем снимке экрана.

Рутованный смартфон

JTAG-адаптер

Для доступа к соли можно использовать специальное оборудование, известное как адаптер JTAG (Joint Test Action Group). Точно так же Riff-Box или JIG-адаптер также могут использоваться для той же функциональности.

Используя информацию, полученную из Riff-box, мы можем найти положение зашифрованных данных, то есть соли . Ниже приведены правила —

  • Найдите связанную строку «lockscreen.password_salt.»

  • Байт представляет фактическую ширину соли, которая является ее длиной .

  • Это та длина, которая фактически ищется, чтобы получить сохраненный пароль / пин-код смартфона.

Найдите связанную строку «lockscreen.password_salt.»

Байт представляет фактическую ширину соли, которая является ее длиной .

Это та длина, которая фактически ищется, чтобы получить сохраненный пароль / пин-код смартфона.

Этот набор правил помогает в получении соответствующих данных о соли.

JTAG-адаптер

Python Forensics — сетевой протокол времени

Наиболее широко используемый протокол для синхронизации времени, широко применяемый на практике, реализуется через сетевой протокол времени (NTP).

NTP использует протокол пользовательских дейтаграмм (UDP), который использует минимальное время для передачи пакетов между сервером и клиентом, которые хотят синхронизироваться с данным источником времени.

Сетевой протокол времени

Особенности протокола сетевого времени следующие:

  • Порт сервера по умолчанию — 123.

  • Этот протокол состоит из множества доступных серверов времени, синхронизированных с национальными лабораториями.

  • Стандарт протокола NTP регулируется IETF, а предлагаемым стандартом является RFC 5905 под названием «Протокол сетевого времени версии 4: спецификация протокола и алгоритмов» [NTP RFC]

  • Операционные системы, программы и приложения используют NTP для правильной синхронизации времени.

Порт сервера по умолчанию — 123.

Этот протокол состоит из множества доступных серверов времени, синхронизированных с национальными лабораториями.

Стандарт протокола NTP регулируется IETF, а предлагаемым стандартом является RFC 5905 под названием «Протокол сетевого времени версии 4: спецификация протокола и алгоритмов» [NTP RFC]

Операционные системы, программы и приложения используют NTP для правильной синхронизации времени.

В этой главе мы сосредоточимся на использовании NTP с Python, что возможно из сторонней библиотеки Python ntplib. Эта библиотека эффективно обрабатывает тяжелую работу, которая сравнивает результаты с моими локальными системными часами.

Установка библиотеки NTP

Файл ntplib доступен для загрузки по адресу https://pypi.python.org/pypi/ntplib/, как показано на следующем рисунке.

Библиотека предоставляет простой интерфейс для NTP-серверов с помощью методов, которые могут преобразовывать поля протокола NTP. Это помогает получить доступ к другим значениям ключа, таким как дополнительные секунды.

Установка библиотеки NTP

Следующая программа на Python помогает понять использование NTP.

import ntplib
import time

NIST = 'nist1-macon.macon.ga.us'
ntp = ntplib.NTPClient()
ntpResponse = ntp.request(NIST)

if (ntpResponse):
   now = time.time()
   diff = now-ntpResponse.tx_time
   print diff;

Вышеуказанная программа выдаст следующий вывод.

Использование вывода NTP

Разница во времени рассчитывается в вышеуказанной программе. Эти расчеты помогают в судебных расследованиях. Полученные данные сети принципиально отличаются от анализа данных, найденных на жестком диске.

Разница в часовых поясах или получение точных часовых поясов может помочь в сборе доказательств для сбора сообщений с помощью этого протокола.

Python Forensics — многопроцессорная поддержка

Специалистам-криминалистам, как правило, трудно применять цифровые решения для анализа множества цифровых доказательств в распространенных преступлениях. Большинство цифровых инструментов исследования являются однопоточными, и они могут выполнять только одну команду за раз.

В этой главе мы сосредоточимся на многопроцессорных возможностях Python, которые могут быть связаны с общими криминалистическими проблемами.

многопроцессорная обработка

Многопроцессорность определяется как способность компьютерной системы поддерживать более одного процесса. Операционные системы, которые поддерживают многопроцессорность, позволяют нескольким программам работать одновременно.

Существуют различные типы многопроцессорной обработки, такие как симметричная и асимметричная обработка . Следующая диаграмма относится к симметричной многопроцессорной системе, за которой обычно следуют криминалистические расследования.

многопроцессорная обработка

пример

Следующий код показывает, как различные процессы перечислены внутри программирования Python.

import random
import multiprocessing

def list_append(count, id, out_list): 
   #appends the count of number of processes which takes place at a time
   for i in range(count):
      out_list.append(random.random())
         
   if __name__ == "__main__": 
      size = 999  
      procs = 2
      # Create a list of jobs and then iterate through 
      # the number of processes appending each process to 
      # the job list  
      jobs = []
         
   for i in range(0, procs): 
      out_list = list() #list of processes 
      process1 = multiprocessing.Process(
         target = list_append, args = (size, i, out_list))

      # appends the list of processes
      jobs.append(process)

   # Calculate the random number of processes
   for j in jobs:
      j.start()  #initiate the process

   # After the processes have finished execution
   for j in jobs:
      j.join()
      print "List processing complete."

Здесь функция list_append () помогает в перечислении множества процессов в системе.

Выход

Наш код выдаст следующий результат:

Поддержка многопроцессорной обработки

Python Forensics — память и криминалистика

В этой главе мы сконцентрируемся на исследовании энергозависимой памяти с помощью Volatility , криминалистической среды на основе Python, применимой к следующим платформам: Android и Linux .

Летучая память

Энергозависимая память — это тип хранилища, в котором содержимое стирается, когда питание системы отключается или прерывается. ОЗУ является лучшим примером энергозависимой памяти. Это означает, что если вы работали с документом, который не был сохранен в энергонезависимой памяти, такой как жесткий диск, и компьютер потерял питание, то все данные будут потеряны.

Как правило, криминалистическая экспертиза изменчивой памяти следует той же схеме, что и другие криминалистические исследования —

  • Выбор цели расследования
  • Получение криминалистических данных
  • Судебный анализ

Основные плагины волатильности, которые используются для Android, собирают дамп оперативной памяти для анализа. Как только дамп ОЗУ собран для анализа, важно начать поиск вредоносного ПО в ОЗУ.

Правила YARA

YARA — это популярный инструмент, который обеспечивает надежный язык, совместим с регулярными выражениями на основе Perl и используется для проверки подозрительных файлов / каталогов и сопоставления строк.

В этом разделе мы будем использовать YARA на основе реализации сопоставления с образцом и объединять их с энергопотреблением. Весь процесс будет полезен для судебного анализа.

пример

Рассмотрим следующий код. Этот код помогает в извлечении кода.

import operator
import os
import sys

sys.path.insert(0, os.getcwd())
import plyara.interp as interp

# Plyara is a script that lexes and parses a file consisting of one more Yara
# rules into a python dictionary representation.
if __name__ == '__main__': 
   file_to_analyze = sys.argv[1] 
   rulesDict = interp.parseString(open(file_to_analyze).read()) 
   authors = {} 
   imps = {} 
   meta_keys = {} 
   max_strings = [] 
   max_string_len = 0 
   tags = {} 
   rule_count = 0  

   for rule in rulesDict: 
      rule_count += 1  
   
   # Imports 
   if 'imports' in rule: 
      for imp in rule['imports']: 
         imp = imp.replace('"','') 
         
         if imp in imps: 
            imps[imp] += 1 
         else: 
            imps[imp] = 1  
   # Tags 
   if 'tags' in rule: 
      for tag in rule['tags']: 
         if tag in tags: 
            tags[tag] += 1 
         else: 
            tags[tag] = 1
            
   # Metadata 
   if 'metadata' in rule: 
      for key in rule['metadata']: 
         if key in meta_keys: 
            meta_keys[key] += 1
         else: 
            meta_keys[key] = 1 
         
         if key in ['Author', 'author']: 
            if rule['metadata'][key] in authors: 
               authors[rule['metadata'][key]] += 1 
            else: 
               authors[rule['metadata'][key]] = 1  

   #Strings 
   if 'strings' in rule: 
      for strr in rule['strings']: 
         if len(strr['value']) > max_string_len: 
            max_string_len = len(strr['value']) 
            max_strings = [(rule['rule_name'], strr['name'], strr['value'])] 
         elif len(strr['value']) == max_string_len: 
            max_strings.append((rule['rule_name'], strr['key'], strr['value']))  
   
   print("\nThe number of rules implemented" + str(rule_count))
   ordered_meta_keys = sorted(meta_keys.items(), key = operator.itemgetter(1),
      reverse = True)
   ordered_authors = sorted(authors.items(), key = operator.itemgetter(1), 
      reverse = True)
   ordered_imps = sorted(imps.items(), key = operator.itemgetter(1), reverse = True)
   ordered_tags = sorted(tags.items(), key = operator.itemgetter(1), reverse = True)

Приведенный выше код даст следующий вывод.

Вывод памяти и криминалистики

Количество реализованных правил YARA помогает получить лучшее представление о предполагаемых файлах. Косвенно, список подозреваемых файлов помогает в сборе соответствующей информации для криминалистов.

Ниже приведен исходный код в github: https://github.com/radhikascs/Python_yara

Python Forensics в Linux

Основной задачей цифровых расследований является обеспечение защиты важных доказательств или данных с помощью шифрования или любого другого формата. Основной пример — хранение паролей. Поэтому необходимо понимать использование операционной системы Linux для внедрения цифровой криминалистики для защиты этих ценных данных.

Информация для всех локальных пользователей в основном хранится в следующих двух файлах —

  • / И т.д. / пароль
  • и т.д. / тень

Первый является обязательным, в котором хранятся все пароли. Второй файл является необязательным и хранит информацию о локальных пользователях, включая хешированные пароли.

Возникают проблемы, связанные с безопасностью хранения информации о пароле в файле, который может прочитать каждый пользователь. Поэтому хешированные пароли хранятся в / etc / passwd , где содержимое заменяется специальным значением « x ».

Соответствующие хеши нужно искать в / etc / shadow . Настройки в / etc / passwd могут переопределять детали в / etc / shadow .

Оба текстовых файла в Linux содержат одну запись в каждой строке, а запись состоит из нескольких полей, разделенных двоеточиями.

Формат / etc / passwd следующий —

Sr.No. Имя поля и описание
1

имя пользователя

Это поле состоит из атрибутов удобочитаемого формата

2

Хэш пароля

Он состоит из пароля в зашифрованном виде в соответствии с функцией шифрования Posix

имя пользователя

Это поле состоит из атрибутов удобочитаемого формата

Хэш пароля

Он состоит из пароля в зашифрованном виде в соответствии с функцией шифрования Posix

Если хеш-пароль сохранен как пустой , то соответствующий пользователь не будет запрашивать пароль для входа в систему. Если это поле содержит значение, которое не может быть сгенерировано алгоритмом хеширования, например восклицательный знак, пользователь не сможет войти в систему с помощью пароля.

Пользователь с заблокированным паролем все еще может войти в систему, используя другие механизмы аутентификации, например, ключи SSH. Как упоминалось ранее, специальное значение « x » означает, что хэш пароля должен быть найден в теневом файле.

Хэш пароля включает в себя следующее:

  • Зашифрованная сольЗашифрованная соль помогает поддерживать блокировки экрана, булавки и пароли.

  • Числовой идентификатор пользователя — это поле обозначает идентификатор пользователя. Ядро Linux назначает этот идентификатор пользователя системе.

  • Числовой идентификатор группы — это поле относится к основной группе пользователя.

  • Домашний каталог — новые процессы запускаются со ссылкой на этот каталог.

  • Командная оболочка — это необязательное поле обозначает оболочку по умолчанию, которая должна запускаться после успешного входа в систему.

Зашифрованная сольЗашифрованная соль помогает поддерживать блокировки экрана, булавки и пароли.

Числовой идентификатор пользователя — это поле обозначает идентификатор пользователя. Ядро Linux назначает этот идентификатор пользователя системе.

Числовой идентификатор группы — это поле относится к основной группе пользователя.

Домашний каталог — новые процессы запускаются со ссылкой на этот каталог.

Командная оболочка — это необязательное поле обозначает оболочку по умолчанию, которая должна запускаться после успешного входа в систему.

Цифровая криминалистика включает сбор информации, которая имеет отношение к отслеживанию улик. Следовательно, идентификаторы пользователя полезны для ведения записей.

Используя Python, вся эта информация может быть автоматически проанализирована для индикаторов анализа, воссоздающих недавнюю активность системы. Отслеживание просто и легко с внедрением Linux Shell.

Программирование на Python с Linux

пример

import sys
import hashlib
import getpass

def main(argv):
   print '\nUser & Password Storage Program in Linux for forensic detection v.01\n' 
  
   if raw_input('The file ' + sys.argv[1] + ' will be erased or overwrite if 
         it exists .\nDo you wish to continue (Y/n): ') not in ('Y','y') : 
   sys.exit('\nChanges were not recorded\n') 
  
   user_name = raw_input('Please Enter a User Name: ')
   password = hashlib.sha224(getpass.getpass('Please Enter a Password:')).hexdigest()
   
   # Passwords which are hashed  
   try: 
      file_conn = open(sys.argv[1],'w') 
      file_conn.write(user_name + '\n') 
      file_conn.write(password + '\n') 
      file_conn.close() 
   except: 
      sys.exit('There was a problem writing the passwords to file!')
      
if __name__ == "__main__": 
   main(sys.argv[1:])

Выход

Пароль хранится в шестнадцатеричном формате в файле pass_db.txt, как показано на следующем снимке экрана. Текстовые файлы сохраняются для дальнейшего использования в компьютерной экспертизе.

Python Forensics в Linux Вывод

Python Forensics — индикаторы компромисса

Индикаторы компромисса (IOC) определяются как «части криминалистических данных, которые включают данные, найденные в записях или файлах системного журнала, которые идентифицируют потенциально вредоносную деятельность в системе или сети».

Контролируя IOC, организации могут обнаруживать атаки и действовать быстро, чтобы предотвратить такие нарушения или ограничить ущерб, остановив атаки на более ранних стадиях.

Есть несколько вариантов использования, которые позволяют запрашивать судебные артефакты, такие как —

  • Ищем конкретный файл по MD5
  • Поиск конкретной сущности, которая фактически хранится в памяти
  • Конкретная запись или набор записей, которые хранятся в реестре Windows

Сочетание всего вышеперечисленного обеспечивает лучшие результаты при поиске артефактов. Как упоминалось выше, реестр Windows предоставляет идеальную платформу для генерации и поддержки IOC, что напрямую помогает в вычислительной экспертизе.

методология

  • Ищите места в файловой системе и, в частности, сейчас в реестре Windows.

  • Ищите набор артефактов, которые были разработаны с помощью инструментов судебной экспертизы.

  • Ищите признаки любых неблагоприятных действий.

Ищите места в файловой системе и, в частности, сейчас в реестре Windows.

Ищите набор артефактов, которые были разработаны с помощью инструментов судебной экспертизы.

Ищите признаки любых неблагоприятных действий.

Следственный жизненный цикл

Следственный жизненный цикл следует МОК и ищет конкретные записи в реестре.

  • Этап 1: начальное доказательство — доказательство компрометации обнаруживается либо на хосте, либо в сети. Ответчики будут расследовать и определить точное решение, которое является конкретным индикатором судебной экспертизы.

  • Этап 2. Создание IOC для хоста и сети. После собранных данных создается IOC, что легко сделать с помощью реестра Windows. Гибкость OpenIOC дает неограниченное количество вариантов того, как может быть создан индикатор.

  • Этап 3. Развертывание IOC на предприятии. После создания указанного IOC следователь развернет эти технологии с помощью API в регистрах Windows.

  • Этап 4: Идентификация подозреваемых . Развертывание МОК помогает идентифицировать подозреваемых обычным способом. Даже дополнительные системы будут определены.

  • Этап 5: сбор и анализ доказательств — доказательства против подозреваемых собираются и анализируются соответствующим образом.

  • Этап 6: уточнение и создание новых МОК . Исследовательская группа может создавать новые МОК на основе своих доказательств и данных, найденных на предприятии, а также дополнительных сведений и продолжать совершенствовать свой цикл.

Этап 1: начальное доказательство — доказательство компрометации обнаруживается либо на хосте, либо в сети. Ответчики будут расследовать и определить точное решение, которое является конкретным индикатором судебной экспертизы.

Этап 2. Создание IOC для хоста и сети. После собранных данных создается IOC, что легко сделать с помощью реестра Windows. Гибкость OpenIOC дает неограниченное количество вариантов того, как может быть создан индикатор.

Этап 3. Развертывание IOC на предприятии. После создания указанного IOC следователь развернет эти технологии с помощью API в регистрах Windows.

Этап 4: Идентификация подозреваемых . Развертывание МОК помогает идентифицировать подозреваемых обычным способом. Даже дополнительные системы будут определены.

Этап 5: сбор и анализ доказательств — доказательства против подозреваемых собираются и анализируются соответствующим образом.

Этап 6: уточнение и создание новых МОК . Исследовательская группа может создавать новые МОК на основе своих доказательств и данных, найденных на предприятии, а также дополнительных сведений и продолжать совершенствовать свой цикл.

На следующем рисунке показаны фазы исследовательского жизненного цикла —

Следственный жизненный цикл

Python Forensics — реализация облака

Облачные вычисления могут быть определены как набор размещенных сервисов, предоставляемых пользователям через Интернет. Это позволяет организациям использовать или даже вычислять ресурс, который включает в себя виртуальные машины (ВМ), хранилище или приложение в качестве утилиты.

Одним из наиболее важных преимуществ создания приложений на языке программирования Python является возможность развертывания приложений практически на любой платформе, включая облако . Это означает, что Python может быть запущен на облачных серверах, а также может быть запущен на таких удобных устройствах, как настольный компьютер, планшет или смартфон.

Одной из интересных перспектив является создание облачной базы с генерацией таблиц Rainbow . Это помогает в интеграции одно- и многопроцессорных версий приложения, что требует некоторых соображений.

Пи Облако

Pi Cloud — это платформа облачных вычислений, которая объединяет язык программирования Python с вычислительной мощью Amazon Web Services.

Пи Облако

Давайте рассмотрим пример реализации облаков Пи с помощью радужных таблиц .

Радужные Столы

Радужная таблица определяется как список всех возможных перестановок в виде простого текста зашифрованных паролей, специфичных для данного алгоритма хеширования.

  • Радужные таблицы следуют стандартному шаблону, который создает список хешированных паролей.

  • Текстовый файл используется для генерации паролей, которые включают символы или простой текст паролей для шифрования.

  • Файл используется облаком Пи, которое вызывает основную функцию для хранения.

  • Вывод хешированных паролей также сохраняется в текстовом файле.

Радужные таблицы следуют стандартному шаблону, который создает список хешированных паролей.

Текстовый файл используется для генерации паролей, которые включают символы или простой текст паролей для шифрования.

Файл используется облаком Пи, которое вызывает основную функцию для хранения.

Вывод хешированных паролей также сохраняется в текстовом файле.

Этот алгоритм может быть использован для сохранения паролей в базе данных, а также для резервного копирования в облачной системе.

Следующая встроенная программа создает список зашифрованных паролей в текстовом файле.

пример

import os
import random
import hashlib
import string
import enchant    #Rainbow tables with enchant 
import cloud      #importing pi-cloud

def randomword(length): 
   return ''.join(random.choice(string.lowercase) for i in range(length))

print('Author- Radhika Subramanian')

def mainroutine():
   engdict = enchant.Dict("en_US")
   fileb = open("password.txt","a+")

   # Capture the values from the text file named password
   while True:
      randomword0 = randomword(6)
      if engdict.check(randomword0) == True:
         randomkey0 = randomword0+str(random.randint(0,99))
      elif engdict.check(randomword0) == False:
         englist = engdict.suggest(randomword0)
         if len(englist) > 0:
            randomkey0 = englist[0]+str(random.randint(0,99))
         else:
            randomkey0 = randomword0+str(random.randint(0,99))

      randomword3 = randomword(5)
      if engdict.check(randomword3) == True:
         randomkey3 = randomword3+str(random.randint(0,99))
      elif engdict.check(randomword3) == False:
         englist = engdict.suggest(randomword3)
         if len(englist) > 0:
            randomkey3 = englist[0]+str(random.randint(0,99))
         else:
            randomkey3 = randomword3+str(random.randint(0,99))
      
      if 'randomkey0' and 'randomkey3' and 'randomkey1' in locals():
         whasher0 = hashlib.new("md5")
         whasher0.update(randomkey0)
         whasher3 = hashlib.new("md5")
         whasher3.update(randomkey3)
         whasher1 = hashlib.new("md5")
         whasher1.update(randomkey1)
         print(randomkey0+" + "+str(whasher0.hexdigest())+"\n")
         print(randomkey3+" + "+str(whasher3.hexdigest())+"\n")
         print(randomkey1+" + "+str(whasher1.hexdigest())+"\n")
         fileb.write(randomkey0+" + "+str(whasher0.hexdigest())+"\n") 
         fileb.write(randomkey3+" + "+str(whasher3.hexdigest())+"\n")
         fileb.write(randomkey1+" + "+str(whasher1.hexdigest())+"\n")

jid = cloud.call(randomword)  #square(3) evaluated on PiCloud
cloud.result(jid)
print('Value added to cloud')
print('Password added')
mainroutine()

Выход

Этот код выдаст следующий вывод —

Вывод облачной реализации

Пароли хранятся в текстовых файлах, которые видны, как показано на следующем снимке экрана.