Socketトランスポート層暗号化
2774 ワード
Periodic task systemは、タスクスケジューリングのコアコンポーネントとして100台以上のサーバで動作する必要があります.この場合、クライアントを認証する必要があります.そこで、転送層の暗号化を考えました.
まず、伝送層
トランスポート層を定義する を読み出す. を閉じる.
トランスポート層
次いで、この
最終パッケージ
締めくくり
簡単な
関連コード:
まず、伝送層
Transport
を抽象化するimport Data.ByteString (ByteString)
import Network.Socket (Socket)
import qualified Network.Socket as Socket (close)
import Network.Socket.ByteString (recv, sendAll)
data Transport = Transport { recvData :: Int -> IO ByteString
, sendData :: ByteString -> IO ()
, close :: IO ()
}
makeSocketTransport :: Socket -> IO Transport
makeSocketTransport sock =
return Transport { recvData = recv sock
, sendData = sendAll sock
, close = Socket.close sock
}
トランスポート層を定義する
Transport
.recvData
データsendData
送信データclose
伝送層Socket
をカプセル化した.トランスポート層
XOR
暗号化/dev/random
を用いてランダムなバイナリKEY
を生成するdd if=/dev/random of=xor_key count=1024 bs=1
次いで、この
KEY
を用いて、伝送層のデータを暗号化する.Lazy
形式でKEY
ファイルを読み込むimport qualified Data.ByteString.Lazy as LB
key
Transport
において、KEY
は循環的に使用される必要があり、LB.cycle
によって1つの循環のKEY
が生成され、IORef
に保存される.import Data.IORef (IORef, atomicModifyIORef', newIORef)
send_key
XOR
のアルゴリズムimport qualified Data.ByteString as B
xorBS :: IORef LB.ByteString -> B.ByteString -> IO B.ByteString
xorBS ref bs = do
xor' atomicModifyIORef' ref (\v -> (LB.drop len v, LB.take len v))
where bs' = LB.fromStrict bs
len = LB.length bs'
xor' = B.pack . LB.zipWith xor bs'
最終パッケージ
Transport
xorSendData transport bs = xorBS send_key bs >>= sendData transport
xorRecvData transport nbytes = xorBS recv_key =<< recvData transport nbytes
makeXORTransport :: Transport -> Transport
makeXORTransport transport = Transport { sendData = xorSendData transport
, recvData = xorRecvData transport
, close = close transport
}
締めくくり
簡単な
Socket
伝送層暗号化はこのように完了した.KEY
は、画像、ファイルなどの他の方法を用いて生成することができる.本文はXOR
の方式を実現しただけで,読者たちも試みたTLS
などの暗号化方式を実現することができる.関連コード:
Transport.hs
XOR.hs
文章がいいと思ったら、あなたに役に立つと思ったら、私に注目してください.