Posting bendera putih, atau Cara saya menyimpan video Anda agar tidak muncul di pelacak

captain_barbossa.jpg

Halo, Habr! Hmm, saya merasa sudah bertemu ... Ah, ya. Berikut adalah pos di mana kami membahas secara apik apakah dapat diterima untuk memantau lingkungan, membatasi pengguna pada jumlah perangkat untuk dilihat, menyediakan file yang dapat dieksekusi, dan bukan video berbayar, dan berperilaku berbeda dalam setiap cara yang mungkin ketika mengatur "perlindungan" program video dari pembajakan.

Dan semuanya akan baik-baik saja, tetapi tidak mungkin untuk mengkritik tanpa mengusulkan solusi sebagai balasannya. "Bisakah kamu berbuat lebih baik?" - Seruan dari komentar terdengar. "Akan lebih baik untuk mendukung rekan senegaranya, membantu membuat produk mereka lebih baik!" - Saya menceritakan kembali beberapa pemikiran umum. Adil. Jadi, saya benar-benar bisa melakukan yang lebih baik . Paling tidak, proposal saya tidak akan mengharuskan pengguna akhir untuk menjalankan perangkat lunak bengkok alih-alih file video yang diharapkan.

Solusi untuk semua masalah


Dan solusinya adalah yang paling sepele, teman: tanda air. Ya, hanya tanda air. Alih-alih memunculkan mekanisme rumit untuk mengikat ke perangkat tertentu, โ€œtandatanganiโ€ urutan video. Itu saja.

Properti apa yang harus dimiliki tanda air untuk melakukan fungsi defensif:

  1. Tanda air harus berisi informasi yang secara unik mengidentifikasi pengguna yang membeli kursus video. Ini bisa berupa kunci aktivasi yang dikeluarkan untuk pengguna, atau login pengguna yang diperoleh saat mendaftar di situs web pembelian kursus video, atau stempel waktu yang terkait dengan waktu pembelian kursus (tentu saja, jika Anda dapat dengan jelas mengaitkannya dengan identitas pembeli), atau apa pun dari opera ini.
  2. Tanda air harus menutupi sebagian besar bingkai sehingga tidak dapat dipotong tanpa kerugian besar untuk kursus video.
  3. Skema watermark overlay harus acak untuk setiap salinan kursus sehingga penjahat tidak menulis mesin otomatis untuk memotong watermark yang sama.

Jika Anda membuat tanda air sangat transparan, keberadaannya tidak akan mengganggu pengguna, tetapi masih layak disebutkan dalam deskripsi kursus sebelum pembayaran .

Jadi, untuk mengekstraksi informasi yang terbuka, seorang bajak laut yang potensial perlu mengikuti salah satu skenario yang dijelaskan di bawah ini:

  1. Hentikan seluruh tanda air (ingat bahwa menurut properti ke-2, tanda air harus menempati seluruh layar dan terus melakukan fungsi pelindungnya bahkan jika sebagian dihapus), sehingga membatalkan klip video (menurut saya, logis bahwa dalam kasus ketika tidak ada sebagian besar tanda air). video, tidak ada nilai video).
  2. Edit setiap frame satu per satu untuk menghilangkan tanda air tanpa menyebabkan kerusakan signifikan pada video. Kompleksitas melakukan tindakan seperti itu secara manual melebihi pembuatan video dari awal, dan menurut properti ke-3, penyusup tidak memiliki cara untuk mengotomatiskan proses.
  3. (?) Saya kira Anda dapat meminta jaringan saraf pintar untuk melakukan ini untuk Anda. Meskipun tidak yakin, bukan spesialis, Anda dapat mengoreksi saya di komentar.

Bukti konsep


Dalam setengah jam, naskah 100 baris sepele telah dikompilasi, menunjukkan kesederhanaan dan aksesibilitas implementasi perlindungan tersebut. Saya menekankan : tidak untuk menunjukkan seberapa pintar saya, tetapi bahkan sebaliknya, untuk mencatat bahwa seseorang yang sangat jauh dari pemrosesan gambar dapat membuat kode yang berfungsi penuh (di bawah spoiler) dalam waktu setengah jam, ini adalah betapa sederhananya:

fckInfoprotectorV2.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Usage: python3 fckInfoprotectorV2.py import os from shutil import rmtree import numpy as np import cv2 class VideoSigner: def __init__(self, video, watermark): os.makedirs('original') os.makedirs('watermarked') self.vidin = cv2.VideoCapture(video) self.fps = self.vidin.get(cv2.CAP_PROP_FPS) self.frame_size = ( int(self.vidin.get(cv2.CAP_PROP_FRAME_WIDTH)), int(self.vidin.get(cv2.CAP_PROP_FRAME_HEIGHT)) ) self.watermark = cv2.imread(watermark, cv2.IMREAD_UNCHANGED) self.wH, self.wW = self.watermark.shape[:2] B, G, R, A = cv2.split(self.watermark) B = cv2.bitwise_and(B, B, mask=A) G = cv2.bitwise_and(G, G, mask=A) R = cv2.bitwise_and(R, R, mask=A) self.watermark = cv2.merge([B, G, R, A]) def __del__(self): rmtree('original') rmtree('watermarked') def _split(self): print('[*] Splitting video by frames... ', end='', flush=True) (success, image), count = self.vidin.read(), 0 while success: path = os.path.join('original', f'{count}.jpg') cv2.imwrite(path, image) success, image = self.vidin.read() count += 1 print('Done') def _watermark(self): print('[*] Signing each frame... ', end='', flush=True) for image_name in sorted( os.listdir('original'), key=lambda x: int(x.split('.')[0]) ): image_path = os.path.join('original', image_name) image = cv2.imread(image_path) h, w = image.shape[:2] image = np.dstack([ image, np.ones((h, w), dtype='uint8') * 255 ]) overlay = np.zeros((h, w, 4), dtype='uint8') half_h_diff = (h - self.wH) // 2 half_w_diff = (w - self.wW) // 2 overlay[half_h_diff:half_h_diff + self.wH, half_w_diff:half_w_diff + self.wW] = self.watermark output = image.copy() cv2.addWeighted(overlay, 0.25, output, 1.0, 0, output) path = os.path.join('watermarked', image_name) cv2.imwrite(path, output) print('Done') def _merge(self): print('[*] Merging signed frames... ', end='', flush=True) self.vidout = cv2.VideoWriter( 'signed.avi', cv2.VideoWriter_fourcc(*'XVID'), fps=self.fps, frameSize=self.frame_size ) for image_name in sorted( os.listdir('watermarked'), key=lambda x: int(x.split('.')[0]) ): image_path = os.path.join('watermarked', image_name) image = cv2.imread(image_path) self.vidout.write(image) print('Done') def sign(self): self._split() self._watermark() self._merge() if __name__ == '__main__': signer = VideoSigner('SampleVideo_1280x720_1mb.mp4', 'watermark.png') signer.sign() 


Hasil skrip, pada contoh ini sebagai contoh:

sample_original.gif

sample_signed.gif


Bukan untuk hype, tetapi hanya untuk kebaikan bersama.

Saya mendapat kehormatan.

Source: https://habr.com/ru/post/id450344/


All Articles