はじめに
今回の暗号技術については私の勉強という一貫というものも含まれていますので、間違い、こうすればもっとよくなる等あればコメント等よろしくお願いします
環境
- Xcode8.2.1
- macOS Sierra
- iOS10 (on Simulator)
- Swift3
- CocoaPods 1.1.1
- Python3.6
暗号化
今回はAESを使った暗号化を使用します。
いくらHTTPS通信であれMITM対策指定ない限りパスワードなどの送受信は平文で見えちゃいますからね。せめて暗号化しましょう。
実装はiOS側でします。
ライブラリ
- CryptoSwift 0.6.7
適当にプロジェクトを作る
ライブラリのインストール
$ pod init
Podfile
pod 'CryptoSwift', '~> 0.6'
$ pod install
サンプルソース
Hoge.swift
import Foundation
import CryptoSwift // ここを書いた時点で「⌘+B」しておくべきかも
class Hoge: NSObject {
func hoge(_ text: String) {
let bytes = [UInt8](text.utf8)
// AESの鍵方式に合わせて各自変更
let key = [UInt8]("12345678901234567890123456789012".utf8)
let iv: [UInt8] = AES.randomIV(AES.blockSize)
do {
let aes = try AES(key: key, iv: iv, blockMode: .CBC)
let encrypted = try aes.encrypt(bytes)
let encryptedData = Data(bytes: encrypted, count: encrypted.count)
let sendData = NSMutableData(bytes: iv, length: iv.count)
sendData.append(encryptedData)
let sendDataBase64 = sendData.base64EncodedString(options: .lineLength64Characters)
print("Encrypt: \(sendDataBase64)")
// Encrypt: rLKCA1hNmqu2dq+08E9mK2lBlspQN0+CYBkWkCQz7IvHhh+qbfysc26Oh1SS4Adq
} catch let error {
print("Error: \(error)")
}
}
}
というような感じで暗号化は一応できたかと思います。
今回使う文字列は「 Lorem ipsum dolor sit amet 」です。
あとはAlamofireでサーバに飛ばすなりなんなりする。割愛します。
復号
基本的に暗号化が必要そうなサーバサイド作る時は私はDjangoを使っていますが、Django特有のところは触らないので悪しからず...
ライブラリ
- Simple-AES-Cipher 1.0.0
とても簡単に暗号化及び復号処理が書けるのでおすすめです。
サンプルソース
decrypt.py
from simple_aes_cipher import AESCipher
encrypt = 'rLKCA1hNmqu2dq+08E9mK2lBlspQN0+CYBkWkCQz7IvHhh+qbfysc26Oh1SS4Adq'
cipher = AESCipher('12345678901234567890123456789012')
plain_text = cipher.decrypt(encrypt)
print(plain_text) # Lorem ipsum dolor sit amet
無事復号できたようです
最後に
こうしたらいいぞぉ〜とかあればドシドシコメントや編集リクエストいただければと思います!