2016-03-06 75 views
0

我有一個PHP REST(網關)服務器。客戶端是一個node.js服務器。他們之間交換的數據被加密(crypto_secretbox)&解密(crypto_secretbox_open)分別使用libsodium easy api實現的PHP &節點。PHP與Node.js之間的libsodium實現差異

PHP中的加密數據在開始時沒有16字節的零(salt),因爲node.js中的加密數據具有16字節的零。

爲了解密PHP中加密的數據節點,我必須在調用secretBox.decrypt之前預先加入16個字節的零(salt)。

要在PHP中解密節點中加密的數據,我必須在調用\ Sodium \ crypto_secretbox_open之前先刪除16個字節的零。

問題:這是最好的方法還是我錯過了一些非常明顯的東西?

+0

它不清楚你的問題是什麼。您已經清楚地找到了兩種實現方案差異的解決方案? – shrmn

+0

嗨。我做了,但我覺得這是一個黑客。我希望有人會告訴我「這就是你怎麼做的,你破解!」 :) – indiangolfer

回答

0

你實際使用secretbox_easy與節點鈉,而不是secretbox

secretbox需要額外的字節被預加/去除。它只適用於向後兼容性,除了C以外,使用它並沒有什麼意義,但由於某些原因,Node-Na提供了它。

PHP綁定不需要這些額外的字節。像大多數其他綁定一樣,secretbox實際上是secretbox_easy

好消息是Node-Sodium也提供了secretbox_easy。你只需要明確地稱它爲secretbox_easy。不需要更多的填充。

+0

謝謝。我會嘗試一下,讓你知道。 – indiangolfer

+0

嗨,弗蘭克。我查看了https://github.com/paixaop/node-sodium中的所有代碼和我的node_modules/sodium中的代碼。我無法找到一個我可以調用的API來傳入祕密密鑰,而不是祕密密鑰。其餘的人都需要公鑰/私鑰對。我的加密/解密基於secretkey而不是公鑰/私鑰。請指教。 – indiangolfer

+0

另外,使用crypto_secretbox和crypto_secretbox_open當鈉的節點執行限制所述祕密密鑰是32個字節長基於在./node_modules/sodium/deps/libsodium/src/libsodium/crypto_stream/salsa20/ref/xor_salsa20_ref.c 代碼PHP的實現似乎沒有這個限制。 – indiangolfer

相關問題