張蕊怡,袁 嵩
(武漢科技大學計算機科學與技術學院,武漢 430065)
在當前高速發展的信息化時代,電子文件形式的資料已經成為眾多公司或者企業發展不可或缺的一部分。并且這一部分電子資料作為公司生存發展的關鍵所在,一旦泄露甚至擴散往往會給公司帶來較大甚至難以衡量的損失,因此,內部電子文件資料的安全性問題被眾多公司或者企業投以大量關注。
傳統方法的核心思想是:借助明水印技術,給用戶所查看的資料附上標明用戶賬戶、簽名、IP 地址、日期等信息的明水印,一旦發生資料泄露等惡性事件時,這些明水印便可以用于解決版權糾紛問題,并同時追溯尋找資料泄露的源頭。但是該方法明顯會過度干擾用戶的視覺體驗,而暗水印技術秉持著盡最大可能不破壞原數據欣賞、使用價值原則[1],恰好有效地避免了這一點。
但在實際生產環境中,如何根據具體的應用場景研發出更具針對性和實用性的系統是一個較為關鍵的問題。
首先,在實際公司應用中,常見情形中的泄露渠道是員工散播了含有公司內部文件的截圖。因而想要溯源到最初泄露資料的源頭,就需要在水印中帶有諸如員工ID、IP 地址、操作時間等與員工個人或操作相關的信息。但由于水印可攜帶的信息往往有限,故而實際應用中的系統對此需要進行一定的取舍和處理。
其次,在實際傳播的過程中有很大可能會出現對原圖片進行了旋轉、裁剪和涂抹攻擊的情況,原本嵌入圖像中的水印會隨著圖像信息的損失一并受損。而隨著圖片受損程度的提高,便越加難以提取水印中的有效信息,最終失去解決版權問題和追溯泄露源頭的功能。因此,實際應用的水印需要具有一定的魯棒性,同時系統所提供的提取水印的手段還需要有能力處理一部分圖片遭受攻擊的情況。
最后,還需要考慮到水印中的信息是否會被提取甚至篡改的情況,即對水印信息的加密也是在實際開發中需要被納入考慮的重要一環,主要考慮以下三個問題:水印中是否需要包含一部分敏感信息;如何處理因水印中的敏感信息被他人提取而導致的額外信息泄露問題;水印信息是否會被篡改導致溯源錯誤反而被不法分子利用。
為了有效解決實際應用場景中會發生的旋轉攻擊問題,本系統選擇使用Hough 變換對圖像進行幾何形狀檢測。由于本文所涉及的水印圖片實際上是二值圖像,每個像素僅分為有效信息和無效信息,所以使用Hough 變換速度相對較快,其中本文使用了Canny算子實現圖片中邊緣的檢測與邊緣的提取流程。
Hough算法從核心思想上來看,是使用表決方式來實現的一種參數估計技術,其中的原理借助了Hough 參數空間與圖像空間的點線對偶性,將圖像空間中的檢測問題轉換到參數空間中進行。在使用該算法的過程中,將Hough 參數空間分割為多個patch。分別為每個區間計算累積矩陣,最終計算的結果如果能夠大于最初設定的閾值,便認為這個區間的交點存在公共直線,反之則舍棄[2],具體流程如圖1所示。

圖1 Hough變換實現傾斜校正流程
在水印嵌入之前,為了增強水印圖像安全性,防止水印被提取,要對嵌入水印的圖像進行置亂[3]。
本文所使用的Arnold 變換(貓臉變換)主要是通過一種裁剪錯切后再取模拼接的過程達到置亂的效果。與其他的置亂算法相比,Arnold變換與其逆變換計算開銷相對較小。
同時由于置亂之后水印的信息在理論上是相對離散的,在遭受攻擊時水印損失相對更加均勻,從而使得提取結果在同樣的損失率下具有更高的辨識度。基于以上考慮,本項目對水印圖像的置亂變換采用Arnold 變換,全體像素移動距離的期望值計算方式如公式(1)所示。
離散余弦變換(DCT)是一種特殊的離散傅里葉變換(DFT),該變換在保持精度的情況下更加高效[4]。圖像經過8 × 8 分塊后再進行DCT變換,此時進行水印的嵌入操作,最后DCT 反變換得到所需要的圖片[5]。
一維DCT變換公式(其二):
二維DCT的公式:
其矩陣形式:
其逆變換公式為:
系統主要使用Java 語言和Python 語言進行編碼實現,其中系統并不包含提供可視化的前端,而是主要編寫后臺代碼以提供一系列便于嵌入其他系統開發應用之中的API。
本系統的Java 后臺代碼主要分為Controller層、Service層、DAO 層、Entity類以及其他便于系統運行的工具等部分。系統主要采用了Spring Boot框架實現自動配置以降低搭建項目的復雜程度,應用了控制反轉(IOC)和面向切面編程(AOP)的思想。
首先在實際應用中,系統需要提供依照公司需求生成水印圖片的功能,本系統提供兩種規格的水印,每一個規格可選擇提供員工的ID、IP 地址、時間等信息。這些參數信息可以選擇不由人工輸入,而由系統自主檢測信息實現自動補全參數,本文涉及的生成水印流程如圖2所示。

圖2 生成水印流程
其中,系統提供了3種不同精確度的日期表示方式,考慮到通常的時間表示方式中部分數字的位數進制小,位數利用率低,故在最高精度的情況下使用基于格林日期的毫秒表示方式進行存儲,合理地節省了信息存儲空間,盡可能地減小了數字水印的添加給用戶造成的視覺干擾。
隨后在確認參數的情況下自動判斷對應規格下文字應有的大小,最終生成并提供一張合格的水印圖片用以完成后續的嵌入功能。
實際系統中該模塊主要使用Java 語言實現,首先通過攔截器提前處理空白參數和用戶登錄的安全性驗證,其中使用了JWT 機制實現token令牌存儲用戶的賬戶基礎信息,便于自動補全用戶的ID,然后將攔截器作為bean寫入配置中。
在后臺Controller 層中判斷是否需要自動填入IP 地址并視情況自主填入參數,調用Service層提供的函數。
其中,在生成正常的水印圖片后,對水印圖片使用了Arnold 置亂實現混沌加密,以此保證水印的抗提取性和抗篡改性。同時也因為置亂的效果,使得圖片遭受攻擊后,損失的水印有效像素位置相對分散,從而盡可能地保證整體的可讀性。
本系統首先將等待嵌入水印圖像的原始圖片分為RGB 三個通道,在得到RGB 圖像的三層矩陣表示后,每個通道依次進行8 × 8 的分塊與DCT 變換處理。再將之前工作步驟中生成的已混沌加密水印圖像嵌入圖片子塊,最終生成所需密鑰圖像。對三個通道的操作使得水印具有魯棒性,針對圖片顏色通道的攻擊在這一操作下將會失去其效用,其具體流程如圖3所示。

圖3 嵌入水印流程
在實際應用過程中,公司或者企業所提供的原始圖片往往不能完全進行8 × 8 的分塊,本文所開發系統中對最后無法分割的邊緣子塊進行了舍棄。在嵌入水印時采用了陽水印的實現方式,以減少水印信息對用戶視覺的干擾。
本系統針對已嵌入水印的圖片提供水印提取功能,其中根據圖片的不同受損情況分別提供三種提取手段,具體流程如圖4所示。

圖4 三種水印提取處理方式流程
第一種情況針對被旋轉圖片進行水印信息的提取,首先通過Canny算子實現邊緣提取,再使用Hough 變換對圖像進行幾何形狀檢測,通過合理設置閾值篩選出合適的旋轉角度并將其恢復水平。最后裁剪掉無效的圖像邊框得到的圖片即可進行提取水印操作。
第二種情況針對被裁剪圖片進行水印信息的提取,將被裁剪后的圖片與不包含水印的原始圖片計算截圖匹配,使用OpenCV 所提供的matchTemplate()函數實現,找出二者最大匹配位置后,將待檢測圖片恢復拼接。最后得到的圖片即可進行提取水印操作。
第三種情況針對被縮放的圖片,通過不斷縮放圖片并與原始圖片進行匹配檢測,找到最合適的縮放比例,最后使用OpenCV 的擴展庫cv2所提供的zoom操作函數得到的圖片即可進行提取水印操作。
提取水印的過程中,首先需要將圖片再次進行8 × 8 分塊,再對子塊進行水印的提取。由于在之前的操作中對水印圖片進行了加密置亂,故在此處需要進行Arnold 逆變換來實現水印信息的解密復原,最終提取出一張水印圖片返回給用戶。
本文使用峰值信噪比(PSNR)來檢測嵌入水印圖像后對用戶視覺的干擾效果,使用結構相似性(SSIM)來檢測水印提取效果。嵌入水印后的圖片與原圖片的對比如圖5 所示,含水印圖片被攻擊后進行提取水印操作的結果對比如表1 所示。

圖5 嵌入水印后的圖片與原圖片對比

表1 遭受攻擊的圖片所提取水印與原水印對比
接口URL:域名/watermark/add。
請求類型:Get請求。
必選參數說明:File 類型的pic 參數,上傳等待被添加水印的原始圖片。int 類型的time-Type 參數,‘0’表示時間信息精確至日,格式為“YYYYMMDD”,‘1’表示時間信息精確至小時,距 離2022 年1 月1 日0 時0 分0 秒所 過 去的小時數,‘2’表示時間信息精確至秒,距離2022年1月1日0時0分0秒所過去的秒數。
非必選參數說明:String 類型的IP 參數,代表水印信息中所要包含的用戶的12 位IP 地址,如果該參數未勾選,則后續自動檢測請求方IP地址信息并填入。String 類型的time 參數,可指定為時間或者其他字符,最高8位,如果該參數未勾選,則自動根據timeType 參數指定的時間格式填入當前時間。String類型的ID參數,最多可包含16 位長度的字符,如果該參數未勾選,則在后續生成的水印中舍去該部分信息。
接口功能說明:本系統提供兩種規格的水印,每一個規格可選擇提供員工的ID、IP地址、時間等信息。這些參數信息可以選擇不由人工輸入,而由系統自主檢測信息實現自動補全參數,最終返回給用戶一張嵌入了上述自定義水印信息的圖片。
接口URL:域名/watermark/extract。
請求類型:Get請求。
必選參數說明:File 類型的resource 參數,需要上傳不包含水印的原始圖片。File 類型的target參數,需要上傳等待被提取水印的圖片。
非必選參數說明:int 類型的type 參數,可根據圖片受損情況指定水印提取的操作流程種類;‘0’表示圖片僅僅受到普通攻擊,比如截圖、拉曲線、模糊、噪聲等攻擊方式;‘1’表示用戶判斷圖片可能受到了旋轉攻擊;‘2’表示用戶判斷圖片可能受到了裁剪攻擊;‘3’表示用戶判斷圖片可能受到了縮放攻擊;如果該參數未勾選,則后續操作中默認等同于type 為‘0’的情況。
接口功能說明:本系統針對已嵌入水印的圖片提供水印提取功能,根據圖片的不同受損情況分別提供三種特殊提取手段。
第一種提取手段適用于從被旋轉圖片中提取水印的情況;第二種提取手段適用于從被裁剪圖片中提取水印的情況;第三種提取手段適用于從被縮放圖片中提取水印的情況,最終返回一張進行提取操作得到的水印圖片給用戶。
本文研究了一種基于DCT 變換的數字水印技術,提出了一種兼顧實際生產需求和風險的暗水印應用方案,實現了能夠輔助用戶對圖片資料進行水印簽名的系統,在監控諸如辦公云桌面的場景下提供合適水印的嵌入與提取功能。
該系統能在實際生產環節中生成不嚴重干擾用戶視覺,又能夠抗提取、抗旋轉、抗裁剪等一系列攻擊的暗水印,還一并對水印信息進行了加密,在保障公司內部電子文件不泄露的同時也兼顧了個人信息的安全性問題,滿足當前實際應用中公司或者企業需求。