偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何為數(shù)據(jù)庫中的位圖添加動(dòng)態(tài)水印

譯文
數(shù)據(jù)庫
開發(fā)人員需要了解如何在不更改數(shù)據(jù)庫或應(yīng)用程序的情況下使數(shù)據(jù)庫中的位圖可跟蹤。

譯者 | 李睿

審校 | 重樓

概要

許多數(shù)據(jù)庫存儲(chǔ)了以blob或文件形式保存的位圖,其中包括照片、文檔掃描、醫(yī)學(xué)圖像等。當(dāng)這些位圖被各種數(shù)據(jù)庫客戶端和應(yīng)用程序檢索時(shí),為了日后的識(shí)別和追蹤,有時(shí)需要在檢索時(shí)為它們添加唯一的水印。在某些情況下,人們甚至希望這些水印是不可見的。

這種動(dòng)態(tài)的位圖操作可以很容易地通過可編程的數(shù)據(jù)庫代理完成,無需對(duì)持久化存儲(chǔ)的位圖進(jìn)行任何修改。

這種方法有以下好處:

  • 水印可以為每次檢索進(jìn)行定制,并可以包含有關(guān)日期、時(shí)間、用戶身份、IP地址等信息。
  • 圖像處理由代理完成,這樣不會(huì)給數(shù)據(jù)庫帶來額外的負(fù)載。
  • 不需要更改數(shù)據(jù)庫或數(shù)據(jù)庫客戶端。

最終結(jié)果

給定一個(gè)存儲(chǔ)在數(shù)據(jù)庫中的位圖,例如下圖:

可編程的數(shù)據(jù)庫代理可以在發(fā)送到客戶端的途中修改位圖,以包含任何所需信息的水印,例如下圖:

工作原理

這個(gè)架構(gòu)很簡(jiǎn)單:它并不依賴于傳統(tǒng)的數(shù)據(jù)庫客戶端與服務(wù)器之間的直接連接,而是采用了一種不同的方式:


客戶端連接到代理,代理連接到服務(wù)器:

然后,代理可以在檢索位圖時(shí)根據(jù)需要處理這些位圖。

例如,它只能為某些位圖添加水印,也可以根據(jù)具體情況使用不同樣式的水印。存儲(chǔ)在數(shù)據(jù)庫中的位圖完全不受影響:它們?cè)谵D(zhuǎn)發(fā)給客戶端時(shí)被動(dòng)態(tài)修改。

優(yōu)點(diǎn)

  • 客戶和數(shù)據(jù)庫對(duì)此一無所知——這對(duì)他們來說是完全透明的。
  • 每當(dāng)圖像被檢索時(shí),都可以為其添加獨(dú)特的水?。ɡ?,日期/時(shí)間、用戶名、客戶端的IP地址等)。
  • 數(shù)據(jù)庫服務(wù)器上不會(huì)增加額外的負(fù)載。

缺點(diǎn)

  • 由于添加了代理,系統(tǒng)變得更加復(fù)雜。
  • 延遲會(huì)增加(通常是適度的),主要取決于圖像的大小,但應(yīng)該與替代方案進(jìn)行比較。

實(shí)例

使用代理,可以創(chuàng)建一個(gè)簡(jiǎn)單的過濾器,為某些位圖添加水印。

如果假設(shè)數(shù)據(jù)庫包含一個(gè)名為images的表,其中包含一個(gè)名為bitmap的列,類型為blob或varbinary(取決于數(shù)據(jù)庫),可以在代理中使用以下參數(shù)創(chuàng)建一個(gè)結(jié)果集過濾器:

Query pattern: regex:select.*from.*images.*

以下一些JavaScript代碼(也使用底層Java引擎):

JavaScript 
 // Get the value of the bitmap column as a byte stream
 let stream = context.packet.getJavaStream("bitmap");
 if (stream === null) {
 return;
 }

 // The text to use as watermark
 const now = new Date();
 const watermark = "Retrieved by " + context.connectionContext.userName + 
 " on " + now.getFullYear() + "/" + (now.getMonth()+1) + "/" + now.getDate();

 // Read the bitmap
 const ImageIO = Java.type("javax.imageio.ImageIO");
 let img = ImageIO.read(stream);

 // Create the Graphics to draw the text
 let g = img.createGraphics();
 const Color = Java.type("java.awt.Color");
 g.setColor(new Color(255, 255, 0, 150));
 const Font = Java.type("java.awt.Font");
 g.setFont(new Font("sans-serif", Font.BOLD, 16));

 // Draw the text at the bottom of the bitmap
 let textRect = textFont.getStringBounds(watermark, g.getFontRenderContext());
 g.drawString(watermark, (img.getWidth() / 2) - (textRect.getWidth() / 2),
 img.getHeight() - (textRect.getHeight() / 2));

 // Write the bitmap to the column value
 const ByteArrayOutputStream = Java.type("java.io.ByteArrayOutputStream");
 let outStream = new ByteArrayOutputStream();
 ImageIO.write(img, "png", outStream);
 context.packet.bitmap = outStream.toByteArray();

啟用這個(gè)過濾器之后,從這個(gè)表中檢索的位圖將包括一個(gè)水印,其中包含數(shù)據(jù)庫用戶的名稱和時(shí)間戳。

數(shù)據(jù)庫永遠(yuǎn)不會(huì)受到影響:存儲(chǔ)在數(shù)據(jù)庫中的位圖完全不變,它們是在發(fā)送給客戶端時(shí)即時(shí)修改的。

顯然,可以選擇性地為位圖添加水印,可以根據(jù)任何相關(guān)因素更改水印的文本,還可以通過字體、顏色、定位、透明度等因素添加水印。有關(guān)詳細(xì)信息,參見這個(gè)示例。

秘密水印

在某些情況下,可能需要以肉眼不可見的方式標(biāo)記位圖。一種簡(jiǎn)單的方法是編輯圖像的元數(shù)據(jù),但如果需要更微妙的東西,可以使用隱寫術(shù)在位圖中分發(fā)秘密消息,使其難以被檢測(cè)到。

可以修改以上的示例以使用Adumbra庫:

// Get the value of the bitmap column as a byte stream
let inStream = context.packet.getJavaStream("bitmap");
if (inStream === null) {
 return;
}
// The hidden message
const now = new Date();
const message = "Retrieved by " + context.connectionContext.userName + 
 " on " + now.getFullYear() + "/" + (now.getMonth()+1) + "/" + now.getDate();
const messageBytes = context.utils.getUTF8BytesForString(message);
const keyBytes = context.utils.getUTF8BytesForString("This is my secret key");
// Hide the message in the bitmap
const Encoder = Java.type("com.galliumdata.adumbra.Encoder");
const ByteArrayOutputStream = Java.type("java.io.ByteArrayOutputStream");
let outStream = new ByteArrayOutputStream();
let encoder = new Encoder(1);
encoder.encode(inStream, outStream, "png", messageBytes, keyBytes);
context.packet.bitmap = outStream.toByteArray();

有了這一點(diǎn),提供給客戶端修改后的位圖將包含一個(gè)難以檢測(cè)的秘密水印,且在沒有密鑰的情況下幾乎無法提取。

水印技術(shù)還有哪些用途?

這種水印技術(shù)也可以應(yīng)用于位圖以外的文檔:

  • 像PDF和MS Word這樣的文檔可以被賦予一些額外的元數(shù)據(jù),或者它們可以被賦予一個(gè)可見或不可見的水印。可以參考PDF文檔的這個(gè)示例。
  • 所有的文本文檔可以巧妙地使用水印技術(shù)進(jìn)行標(biāo)記,例如改變間距、拼寫、布局、字體和顏色、零寬度字符等。
  • 所有能夠在不失去任何重要意義的情況下進(jìn)行微小更改的數(shù)字文檔,例如位圖、音頻文件和樣本集,都能夠以類似的方式進(jìn)行修改。
  • 事實(shí)上,整個(gè)數(shù)據(jù)集可以通過巧妙地修改數(shù)據(jù)的一些非關(guān)鍵方面來添加水印,從而有可能在以后識(shí)別這些數(shù)據(jù)集并確切地知道它們的來源。這超出了本文的范圍,但是有許多方法可以使數(shù)據(jù)追溯到其起源。

結(jié)論

當(dāng)需要從數(shù)據(jù)庫中檢索位圖或文檔時(shí),并且每次檢索都需要一個(gè)定制的水印,這里展示的技術(shù)是一種可靠的方法,它避免了給數(shù)據(jù)庫帶來任何額外的負(fù)擔(dān),并且不需要對(duì)客戶端或服務(wù)器進(jìn)行任何更改。

原文標(biāo)題:Dynamic Watermarking of Bitmaps in Databases,作者:Max Tardiveau


責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2017-11-20 13:32:54

微服務(wù)數(shù)據(jù)庫開發(fā)

2015-03-31 10:26:01

數(shù)據(jù)庫數(shù)據(jù)庫事務(wù)

2022-05-05 09:11:33

數(shù)據(jù)庫加密數(shù)據(jù)安全

2010-05-24 14:38:41

MySQL數(shù)據(jù)庫

2010-09-16 15:56:15

SQL Server表

2021-02-23 23:06:31

數(shù)據(jù)庫Redis技術(shù)

2021-03-28 17:14:38

數(shù)據(jù)庫APP技術(shù)

2011-05-16 14:07:12

MySQL數(shù)據(jù)庫設(shè)置密碼

2010-05-04 12:29:15

Oracle數(shù)據(jù)庫

2020-07-16 07:50:53

Nginx模塊動(dòng)態(tài)

2011-04-11 15:19:53

Access 2007數(shù)據(jù)庫附件

2023-10-16 09:00:00

數(shù)據(jù)庫分布式系統(tǒng)

2017-03-15 16:45:02

SQL Server 數(shù)據(jù)庫分配用戶

2015-07-07 10:12:52

數(shù)據(jù)中心閃存

2014-09-01 11:08:34

LinuxSSH

2011-06-07 17:01:44

2022-07-25 09:46:25

React數(shù)據(jù)庫

2010-11-17 09:18:27

數(shù)據(jù)庫

2009-02-17 10:34:00

2017-11-24 09:30:58

數(shù)據(jù)庫微服務(wù)云架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)