[英]Passing sensitive data from C to Java
我正在開發一個C程序,該程序必須通過popen()
調用Java
main()
並將一些數據作為命令行參數發送給它。 但是,還有一些數據需要從C
發送到Java
,這實際上本質上是敏感的(盡管不是密碼類型)。
我正在嘗試查看是否有除加密之外的其他選項,可以將這些額外的數據從C發送到Java。 我試圖避免開銷,因為數據不那么敏感,無法進行加密,但是我對此有任何建議。
我無法通過popen()發送這些額外的數據,因為它將通過ps -f
可見。
同樣,使用套接字似乎並不可行,因為tcpdump
也可以顯示該信息。
我考慮使用共享mem (/dev/shm)
但是也可以查看或使用隱藏文件。 因為,這還伴隨着每次調用創建文件的開銷,所以我並不完全贊成。
我看了ANON
文件映射,但我想我不能在Java端使用它。 同樣,通過Java似乎無法使用fmemopen()
引用。 FIFO
管道會更好嗎? 還是可以輕松閱讀它們?
如果我只求助於簡單的mmap()
並向其中寫入數據( 而不是在磁盤上創建它-在open call中沒有O_CREAT ),並且不執行msynch
,它將完全保留在內存中嗎? 然后可以從中讀取Java嗎?
加密是我唯一的選擇,還是我缺少基本知識?
該鏈接討論了如何從C向Java發送純數據。
如果用戶可以使用tcpdump,則該用戶具有root訪問權限。 該用戶還可以在Java程序上放置調試器,甚至在加密數據之前,也可以確切地看到它的作用。 實現所需目標的唯一方法是采用完全模糊處理技術和加密,就像Skype客戶端所做的那樣1 。
但是,由於您同時說數據不是那么敏感,因此似乎有些過分。 也許是一種簡單的混淆技術,這樣偶然的觀察者看不到輸出就足夠了嗎? (建議使用Rocker 。)或者,或者確保“不受信任的”用戶在運行系統(Java + C程序)的服務器上沒有root用戶訪問權限。
不錯的2混淆和可能的折衷選擇是使用mmap()(或System V shared mem )進行通信。
如果使用MAP_LOCKED選項和MAP_ANONYMOUS ,則存儲區域將不會在磁盤上結束。 MAP_LOCKED阻止它進行交換,並且MAP_ANONYMOUS告訴操作系統不要使用備份文件。
另外,您是否考慮過使用JNI來訪問C代碼? 這樣,您的C代碼將成為Java流程的一部分,並且不受信任的用戶將需要調試器來監視正在發生的事情。
2 這將使我停下很長時間,在弄清到底發生了什么之前,我必須閱讀很多有關調試技術的知識,然后進行大量工作才能弄清楚這兩個程序之間的“話題”。 一個更有才華的人可能最多在一個下午就破譯一切。
避免緊張的用戶使用數據的最佳方法是encr。 如果您仍然想要除一種方法以外的其他機制,則可以-
如果您的數據包含多種數據類型的混合,即int float char *等,則可以將數據轉換為二進制格式。 二進制數據不能被用戶直接讀取。 但是精打細算的用戶如果願意的話可以轉換回原始格式。 只有用戶願意時才可以對其進行加密。
但是不建議這樣做。 使用一些標准的編碼器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.