如何为数据库中的位图添加动态水印

许多数据库存储了以blob或文件形式保存的位图,其中包括照片、文档扫描、医学图像等。当这些位图被各种数据库客户端和应用程序检索时,为了日后的识别和追踪,有时需要在检索时为它们添加唯一的水印。在某些情况下,人们甚至希望这些水印是不可见的。

这种动态的位图操作可以很容易地通过可编程的数据库代理完成,无需对持久化存储的位图进行任何修改。

这种方法有以下好处:

  • 水印可以为每次检索进行定制,并可以包含有关日期、时间、用户身份、IP地址等信息。
  • 图像处理由代理完成,这样不会给数据库带来额外的负载。
  • 不需要更改数据库或数据库客户端。
最终结果

给定一个存储在数据库中的位图,例如下图:

可编程的数据库代理可以在发送到客户端的途中修改位图,以包含任何所需信息的水印,例如下图:

工作原理

这个架构很简单:它并不依赖于传统的数据库客户端与服务器之间的直接连接,而是采用了一种不同的方式:

客户端连接到代理,代理连接到服务器:

然后,代理可以在检索位图时根据需要处理这些位图。

例如,它只能为某些位图添加水印,也可以根据具体情况使用不同样式的水印。存储在数据库中的位图完全不受影响:它们在转发给客户端时被动态修改。

优点
  • 客户和数据库对此一无所知——这对他们来说是完全透明的。
  • 每当图像被检索时,都可以为其添加独特的水印(例如,日期/时间、用户名、客户端的IP地址等)。
  • 数据库服务器上不会增加额外的负载。
缺点
  • 由于添加了代理,系统变得更加复杂。
  • 延迟会增加(通常是适度的),主要取决于图像的大小,但应该与替代方案进行比较。
实例

使用代理,可以创建一个简单的过滤器,为某些位图添加水印。

如果假设数据库包含一个名为images的表,其中包含一个名为bitmap的列,类型为blob或varbinary(取决于数据库),可以在代理中使用以下参数创建一个结果集过滤器:

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();

启用这个过滤器之后,从这个表中检索的位图将包括一个水印,其中包含数据库用户的名称和时间戳。

数据库永远不会受到影响:存储在数据库中的位图完全不变,它们是在发送给客户端时即时修改的。

显然,可以选择性地为位图添加水印,可以根据任何相关因素更改水印的文本,还可以通过字体、颜色、定位、透明度等因素添加水印。有关详细信息,参见这个示例。

秘密水印

在某些情况下,可能需要以肉眼不可见的方式标记位图。一种简单的方法是编辑图像的元数据,但如果需要更微妙的东西,可以使用隐写术在位图中分发秘密消息,使其难以被检测到。

可以修改以上的示例以使用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();

有了这一点,提供给客户端修改后的位图将包含一个难以检测的秘密水印,且在没有密钥的情况下几乎无法提取。

水印技术还有哪些用途?

这种水印技术也可以应用于位图以外的文档:

  • 像PDF和MS Word这样的文档可以被赋予一些额外的元数据,或者它们可以被赋予一个可见或不可见的水印。可以参考PDF文档的这个示例。
  • 所有的文本文档可以巧妙地使用水印技术进行标记,例如改变间距、拼写、布局、字体和颜色、零宽度字符等。
  • 所有能够在不失去任何重要意义的情况下进行微小更改的数字文档,例如位图、音频文件和样本集,都能够以类似的方式进行修改。
  • 事实上,整个数据集可以通过巧妙地修改数据的一些非关键方面来添加水印,从而有可能在以后识别这些数据集并确切地知道它们的来源。这超出了本文的范围,但是有许多方法可以使数据追溯到其起源。
结论

当需要从数据库中检索位图或文档时,并且每次检索都需要一个定制的水印,这里展示的技术是一种可靠的方法,它避免了给数据库带来任何额外的负担,并且不需要对客户端或服务器进行任何更改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/759855.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】 1.1 什么是高斯金字塔? 高斯金字塔(Gaussian Pyramid)是一种多分辨率图像表示方法,用于图像处理和计算机视觉领域。它通过对原始图像进行一系列的高斯平滑和下采样操作&#x…

istitle()方法——判断首字母是否大写其他字母小写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 istitle()方法用于判断字符串中所有的单词首字母是否为大写而其他字母为小写。istitle()方法的语法格式如下: str.istitle() …

Java并发编程基础知识点

目录 Java并发编程基础知识点1、线程,进程概念及二者的关系进程相关概念线程相关概念进程与线程的关系补充小知识点: 2、线程的状态Java线程的状态:Java线程不同状态之间的切换图示 3、Java程序中如何创建线程?①、继承Thread类②…

【python】python知名品牌调查问卷数据分析可视化(源码+调查数据表)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

某度,网盘免费加速,复活!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 有小伙伴反馈之前如下夸克网盘脚本的加速方法失效,小武今天测试,依旧正常使用! 百度/迅雷/夸克,网盘免费加速,已破&#xf…

Vite: 高阶特性 Pure ESM

概述 ESM 已经逐步得到各大浏览器厂商以及 Node.js 的原生支持,正在成为主流前端模块化方案。 而 Vite 本身就是借助浏览器原生的 ESM 解析能力( type“module” )实现了开发阶段的 no-bundle ,即不用打包也可以构建 Web 应用。不过我们对于原生 ESM 的…

线性表与顺序存储结构(下)

前言 接上文(线性表与顺序存储结构(上))。 这些顺序存储结构的方法在顺序表上下卷中已经提到过,但是有些许不同,可以为理解顺序表提供更丰富的视角。(不过最主要的区别在于顺序表上下卷中的顺…

FairGuard游戏加固无缝兼容 Android 15 预览版

2024年6月25日,谷歌发布了 Android 15 Beta 3 ,作为Android 15 “平台稳定性”的里程碑版本,谷歌建议所有应用、游戏、SDK、库和游戏引擎开发者都将“平台稳定性”里程碑版本作为规划最终兼容性测试和公开发布的目标。 安卓开发者博客提供的版…

Hadoop3:MapReduce中的ETL(数据清洗)

一、概念说明 “ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL一词较常用在数据仓库&#…

算法09 日期相关模拟算法【C++实现】

这是《C算法宝典》算法篇的第09节文章啦~ 如果你之前没有太多C基础,请点击👉专栏:C语法入门,如果你C语法基础已经炉火纯青,则可以进阶算法👉专栏:算法知识和数据结构👉专栏&#xff…

模型预测控制:线性MPC

模型预测控制:线性MPC 模型预测控制(Model Predictive Control, MPC)是一种广泛应用于工业过程控制和自动驾驶等领域的先进控制技术。MPC通过在线解决优化问题来计算控制输入,从而实现系统的最优控制。本文将介绍线性MPC的系统模…

架构师篇-8、运用事件风暴进行业务领域建

如何成为优秀架构师? 需要有一定的技术积累,但是核心是懂业务。 具备一定的方法,并且有很强的业务理解能力。 技术架构师:形成技术方案,做的更多的是底层的平台,提供工具。 业务架构师:解决方…

Cyber Weekly #13

赛博新闻 1、谷歌发布最强开源小模型Gemma-2 本周五(6月28日)凌晨,谷歌发布最强开源小模型Gemma-2,分别为9B(90亿)和27B(270亿)参数规模,其中9B 模型在多项基准测试中均…

50-4 内网信息收集 - 本机信息收集

一、内网信息收集 内网信息收集可以从以下几个方面进行:本机信息收集、域内信息收集、内网资源探测等。通过这些步骤,我们可以全面了解当前主机的角色和所处内网的拓扑结构,从而选择更合适、更精准的渗透方案。 二、本机基础信息收集 在本机基础信息收集阶段,可以执行以下…

怎么监控公司文件?高效省力的7个办法,企业都在用

公司文件监控方法主要包括以下几个方面,以确保数据安全和防止文件泄密: 使用专业监控软件:如安企神等专业的企业级监控软件,可以详细记录员工的电脑操作,包括文件访问、修改、删除、复制等行为,以及外设使用…

RTMP推流到SRS流媒体服务器消息处理

RTMP推流到SRS流媒体服务器消息处理 SRS和客户端是怎么交换消息的?各个消息有什么作用?握手成功后,SRS和客户端进行消息交换,对应wiresharek这部分截图: 流程图(之前画的,可能不够详细&#xf…

百亿级存储架构: ElasticSearch+HBase 海量存储架构与实现

百亿级存储架构: ElasticSearchHBase 海量存储架构与实现 尼恩:百亿级数据存储架构起源 在40岁老架构师 尼恩的读者交流群(50)中,经常性的指导小伙伴们改造简历。 经过尼恩的改造之后,很多小伙伴拿到了一线互联网企业如得物、阿…

AI模型的奥运会:谁将在OlympicArena中夺冠?

获取本文论文原文PDF,请在公众号【AI论文解读】留言:论文解读 引言:AI模型的奥林匹克级评测 评估和比较不同AI模型的性能始终是一个核心话题。随着技术的不断进步,这些模型在处理复杂任务的能力上有了显著的提升。为了更精确地衡…

springboot汽车租赁管理系统-计算机毕业设计源码08754

目 录 摘 要 第 1 章 引 言 1.1 选题背景和意义 1.2 国内外研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析…

有了文章生成器,轻易满足你对文章的需求

写文章对于大多数人来说并不轻松,往往一篇文章写作完成是需要消耗一个人的大量时间与精力的,如果想要写的文章特别好,那么还要再花一点时间去进入后期的修改。就没有什么方法让大家轻易的去完成文章写作吗?答案是有的,…