https://github.com/drylikov/secrets.clj
A library designed to generate cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets.
https://github.com/drylikov/secrets.clj
authentication choice clj clojure cryptography drng jvm password prng random rng secrets secure security timestamp token uuid xkcd
Last synced: 3 months ago
JSON representation
A library designed to generate cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets.
- Host: GitHub
- URL: https://github.com/drylikov/secrets.clj
- Owner: drylikov
- License: mit
- Created: 2024-11-22T21:01:21.000Z (6 months ago)
- Default Branch: drylikov
- Last Pushed: 2024-11-22T21:08:40.000Z (6 months ago)
- Last Synced: 2025-01-23T09:31:01.337Z (4 months ago)
- Topics: authentication, choice, clj, clojure, cryptography, drng, jvm, password, prng, random, rng, secrets, secure, security, timestamp, token, uuid, xkcd
- Language: Clojure
- Homepage:
- Size: 9.77 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
A library designed to generate cryptographically strong random numbers suitable for managing data such as passwords, account authentication, security tokens, and related secrets.
The `secrets.clj` is a port of the [`secrets`](https://docs.python.org/3/library/secrets.html)
module from Python's standard library for Clojure.## Installation
Add the following dependency to your `project.clj` file:
**Leiningen/Boot**:
```clojure
[likid_drylikov/secrets "2.1.1"]
```**Clojure CLI/deps.edn**:
```clojure
likid_drylikov/secrets {:mvn/version "2.1.1"}
```## Usage examples
```clojure
user=> (secrets.core/token-hex 32)
"2aa5430064918acf140bb423678cef7353f7055597bc61305414c5371106ebef"user=> (secrets.core/token-urlsafe 32)
"kfbGVrB6jz6hyOl_2rX9UIHgiop2-rM_jo2XEK7oTj0"user=> (secrets.core/token-bytes 16)
#object["[B" 0x3b2454e9 "[B@3b2454e9"]user=> (secrets.core/randbelow 100)
71user=> (secrets.core/randbits 32)
1530556122user=> (secrets.core/choice [8 16 32 64 128])
8user=> (secrets.core/choices [8 16 32 64 128] 2)
(128 16)user=> (secrets.tools/uuid4)
"84e9c5c0-ceb4-4aab-9a58-668f59b9a9e5"user=> (secrets.tools/unix-timestamp)
1601927558
```See [«Recipes and best practices»](#recipes-and-best-practices) for more usage examples.
## Recipes and best practices
This section shows recipes and best practices for using secrets to manage a basic level of security.Generate an eight-character alphanumeric password:
```clojure
(ns example.security
(:use [clojure.string :only [join]]
[secrets.core]
[secrets.constants :only [ascii-letters digits]]))(defn generate-password [n]
(join "" (secrets.core/choices (str ascii-letters digits)) n))
``````clojure
example.security=> (generate-password 8)
"7gHY2N4s"
```**Note**: Applications should not [store passwords in a recoverable format](http://cwe.mitre.org/data/definitions/257.html),
whether plain text or encrypted. They should be salted and hashed using a cryptographically-strong one-way (irreversible) hash function.Generate an [XKCD-style passphrase](https://xkcd.com/936/):
```clojure
(ns example.security
(:use [secrets.core]
[clojure.string :only [join lower-case split-lines]))(def words
(-> (slurp "/usr/share/dict/words")
(split-lines)))(defn generate-passphrase [n]
(-> (join " " (secrets.core/choices words n))
(lower-case)))
``````clojure
example.security=> (generate-passphrase 5)
"uniaxally intercarrier straddleback basihyoid unhusk"
```Generate a hard-to-guess temporary URL containing a security token suitable for password recovery applications:
```clojure
(ns example.security
(:use [secrets.core :only [token-urlsafe]]))(defn generate-password-recovery-url [n]
(str "https://mydomain.com/reset=" (token-urlsafe n)))
``````clojure
example.security=> (generate-password-recovery-url 32)
"https://mydomain.com/reset=3kOJuScK1mHyxXWnuMBAUQaIEdsBUluQBR-3Zlvv8XQ"
```