DEV Community

Wesley de Groot
Wesley de Groot

Posted on • Originally published at wesleydegroot.nl on

OTP Code Generation with CryptoKit: A Swift Approach

Introduction

In the realm of secure authentication, One-Time Passwords (OTPs) play a crucial role. Whether it's two-factor authentication (2FA) or protecting sensitive transactions, OTPs provide an additional layer of security. In this article, we'll explore how to generate OTPs using CryptoKit, Apple's powerful cryptographic framework.

What Is an OTP?

An OTP is a temporary password that is valid for a single use or a short period. It ensures that even if an attacker intercepts the password, they won't be able to reuse it. OTPs are commonly used in scenarios like logging into online accounts, confirming transactions, or accessing secure systems.

Understanding TOTP (Time-Based OTP)

  • TOTP is a type of OTP that changes over time. It's based on a shared secret key and the current time.
  • The secret key is known only to the user and the server.
  • The server and the user's device both calculate the same OTP based on the secret key and the current time.
  • The OTP is typically a 6 or 8-digit numeric code.

Generating TOTP with CryptoKit

Let's dive into the Swift code for generating a TOTP using CryptoKit. We'll assume you already have a shared secret key (usually provided during user registration).

import CryptoKit import CommonCrypto import Foundation func cryptoKitTOTP(secret: String) -> String { let period = TimeInterval(30) let digits = 6 let secret = base32Decode(value: secret)! var counter = UInt64(Date().timeIntervalSince1970 / period).bigEndian // Generate the key based on the counter. let key = SymmetricKey(data: Data(bytes: &counter, count: MemoryLayout.size(ofValue: counter))) let hash = HMAC<Insecure.SHA1>.authenticationCode(for: secret, using: key) var truncatedHash = hash.withUnsafeBytes { ptr -> UInt32 in let offset = ptr[hash.byteCount - 1] & 0x0f let truncatedHashPtr = ptr.baseAddress! + Int(offset) return truncatedHashPtr.bindMemory(to: UInt32.self, capacity: 1).pointee } truncatedHash = UInt32(bigEndian: truncatedHash) truncatedHash = truncatedHash & 0x7FFF_FFFF truncatedHash = truncatedHash % UInt32(pow(10, Float(digits))) return String(format: "%0*u", digits, truncatedHash) } print(cryptoKitTOTP(secret: "5FAA5JZ7WHO5WDNN"))

Conclusion

By leveraging CryptoKit, you can easily implement TOTP generation in your iOS apps. Remember to securely store and manage the shared secret key. OTPs enhance security and protect your users' accounts from unauthorized access.

For more details, refer to the official Apple CryptoKit documentation.

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay