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

news2025/1/19 17:17:27

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数组】- 螺旋矩阵 II

1. 对应力扣题目连接 螺旋矩阵 II 题目简述: 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。如图: 2. 实现案例代码 public class SpiralMatrix {public static…

网页搜索如何优化效果最好?

可以使用长尾关键词策略,长尾关键词策略是指在SEO优化中,除了使用常规的短关键词外,还深入挖掘和使用那些更长、更具体的关键词。虽然这些关键词的搜索量较低,但竞争也较少,且更具针对性,因此往往能带来更高…

我的世界服务器-高版本服务器-MC服务器-生存服务器-RPG服务器-幻世星辰

生存为主,RPG乐趣为辅,重视每位玩家的建议,一起打造心目中的服务器,与小伙伴一起探险我的世界! 服务器版本: 1.18.2 ~ 1.20.4 Q群: 338238381 服务器官网: 星辰毛毛雨-Minecraft高版本生存服务器我的世界…

PMBOK® 第六版 结束项目或阶段

目录 读后感—PMBOK第六版 目录 不论是阶段的收尾还是项目整体的收尾,都应是令人振奋的事。然而,在实际生活中,收尾工作却相当艰难。会遭遇负责人调离、换任,导致不再需要已购产品;项目收尾时对照招标文件或合同&…

[AIGC] 深入了解标准与异常重定向输出

在操作系统和编程环境下,有时我们需要更加精细地控制程序的输入或输出过程,这就涉及到了标准输入输出流,以及重定向的概念。接下来,我们将详细介绍标准输出、标准错误输出,以及如何进行输出重定向。 文章目录 1. 标准输…

企业im(即时通讯)作为安全专属的移动数字化平台的重要工具

企业IM即时通讯作为安全专属的移动数字化平台的重要工具,正在越来越多的企业中发挥着重要的作用。随着移动技术和数字化转型的发展,企业对于安全、高效的内部沟通和协作工具的需求也越来越迫切。本文将探讨企业IM即时通讯作为安全专属的移动数字化平台的…

坏越的小世界的一些修改调整

留言区感觉不够高大上,功能也比较简单。我想了想还是仿照小红书设计一个。 先写个静态 这边想了想是将留言和评论各放一个表和首次加载的放在一个表好。想了想还是选择了后者 不过在sql上这样可能会很麻烦,还是建议分表,看下布局 每次展开会…

QT加载安装外围依赖库的翻译文件后翻译失败的现象分析:依赖库以饿汉式的形式暴露单例接口导致该现象的产生

1、前提说明 VS2019 QtClassLibaryDll是动态库,QtWidgetsApplication4是应用程序。 首先明确:动态库以饿汉式的形式进行单例接口暴露; 然后,应用程序加载动态库的翻译文件并进行全局安装; // ...QTranslator* trans = new QTranslator();//qDebug() << trans->…

支付宝支付之收款码支付

文章目录 收款码支付接入流程安全设计系统交互流程交易状态统一收单交易支付接口请求参数测试结果查询支付撤销支付退款支付退款结果退款说明 收款码支付 继&#xff1a;支付宝支付之入门支付 接入流程 安全设计 支付宝为了保证交易安全采取了一系列安全手段以保证交易安全。…

路由器的ip地址与网关的区别是什么

在网络世界中&#xff0c;路由器扮演着至关重要的角色&#xff0c;它负责数据的传输和网络的互联。而在路由器的设置中&#xff0c;有两个常见的概念&#xff1a;IP地址和网关。那么&#xff0c;路由器的IP地址与网关的区别是什么&#xff1f;下面与虎观代理小二一起了解一下吧…

德国威步的技术演进之路(上):从软件保护到用户体验提升

德国威步自1989年成立以来一直专注于数字安全技术的研究和发展&#xff0c;在软件保护和数字授权领域树立了行业标杆&#xff0c;并在云端许可管理和物联网安全技术方面不断创新。德国威步的成就彰显了其对安全、创新和可持续发展的坚定追求。 德国威步将“完美保护、完美授权…

维卡币(OneCoin)是投资骗局!中国成维卡币传销重灾区,信徒们醒醒吧!创始人被通缉,生死不明!

维卡币(英文名&#xff1a;OneCoin)是一个隐藏在加密货币外表下的庞氏骗局&#xff0c;因传销诈骗和违法吸金被起诉&#xff0c;受害者遍布全球。它的创始人Ruja Ignatova因欺骗和洗钱被列为通缉嫌疑人&#xff0c;成为全球最大金融诈骗案件之一的逃犯&#xff0c;目前美国政府…

INS-GPS组合导航——卡尔曼滤波

系列文章目录 《SAR笔记-卫星轨道建模》 《SAR笔记-卫星轨迹&#xff08;三维建模&#xff09;》 《常用坐标系》 文章目录 前言 一、经典卡尔曼滤波 二、扩展卡尔曼滤波 三、无迹卡尔曼滤波 总结 前言 SAR成像仪器搭载于运动平台&#xff0c;平台的自定位误差将影响SAR…

Go 语言环境搭建

本篇文章为Go语言环境搭建及下载编译器后配置Git终端方法。 目录 安装GO语言SDK Window环境安装 下载 安装测试 安装编辑器 下载编译器 设置git终端方法 总结 安装GO语言SDK Window环境安装 网站 Go下载 - Go语言中文网 - Golang中文社区 还有 All releases - The…

单晶层状氧化物制作方法技术资料 纳离子技术

网盘 https://pan.baidu.com/s/1hjHsXvTXG74-0fDo5TtXWQ?pwd10jk 单晶型高熵普鲁士蓝正极材料及其制备方法与应用.pdf 厘米级铬氧化物单晶及其制备方法和存储器件.pdf 多孔氧化物单晶材料及其制备方法和应用.pdf 大单晶层状氧化物正极材料及其制备方法和应用.pdf 富钠P2相层状…

第四十篇——系统论:如何让整体效用大于部分之和?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 系统论&#xff0c;又从一个大的生态的角度去考虑&#xff0c;我们应该如…

足球虚拟越位线技术FIFA OT(一)

此系列文章用于记录和回顾开发越位线系统的过程&#xff0c;平时工作较忙&#xff0c;有空时更新。 越位线技术 越位技术已被用于图形化分析足球中潜在的越位情况。 自 2018 年将视频助理裁判 &#xff08;VAR&#xff09; 引入比赛规则以来&#xff0c;人们越来越关注准确确…

昇思MindSpore学习总结六——函数式自动微分

神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08;loss function&#xff09;获得loss&#xff0c;然后进行反向传播计算&#xff0c;求得梯度&#xff08;gradients&…

【C语言】--分支和循环(1)

&#x1f37f;个人主页: 起名字真南 &#x1f9c7;个人专栏:【数据结构初阶】 【C语言】 目录 前言1 if 语句1.1 if1.2 else1.3 嵌套if1.4 悬空else 前言 C语言是结构化的程序设计语言&#xff0c;这里的结构指的是顺序结构、选择结构、循环结构。 我们可以用if、switch实现分支…

鸿蒙开发设备管理:【@ohos.multimodalInput.inputDevice (输入设备)】

输入设备 输入设备管理模块&#xff0c;用于监听输入设备连接、断开和变化&#xff0c;并查看输入设备相关信息。比如监听鼠标插拔&#xff0c;并获取鼠标的id、name和指针移动速度等信息。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&…