[![Go Report Card](https://goreportcard.com/badge/github.com/Luzifer/password)](https://goreportcard.com/report/github.com/Luzifer/password)
![](https://badges.fyi/github/license/Luzifer/password)
![](https://badges.fyi/github/downloads/Luzifer/password)
![](https://badges.fyi/github/latest-release/Luzifer/password)

# Luzifer / password

This project is a rewrite of my former password generator written in Python. The intention is to provide a fast and secure way to generate one or more passwords using a CLI tool, a HTTPs page or a HTTPs API.

## Usage

### Via Web

My service [Secure Password](https://pwd.luzifer.io/) is powered by this app and will provide you with secure passwords.

### Via [Alfred](https://www.alfredapp.com/)

1. Ensure you do have Alfred 3 and have enabled the Powerpack
2. Download and open the `PasswordGenerator.alfredworkflow` from [Github releases](https://github.com/Luzifer/password/releases/latest)
3. Let Alfred install the workflow
4. Generate passwords using `pwd 12` or with special characters `pwd 12 s`

The workflow is set up to automatically check for updates once a day. If you want to check for updates manually open Alfred, enter `pwd workflow:update` and press enter.

### Via CLI

1. Download the compiled binary from [Github releases](https://github.com/Luzifer/password/releases/latest)
2. Generate your password:

    ```bash
    # ./password get -h
    NAME:
      get - generate and return a secure random password

    USAGE:
      command get [command options] [arguments...]

    OPTIONS:
      --length, -l "20"	length of the generated password
      --special, -s	use special characters in your password

    # ./password get
    Vzupi4IaPbXmSQEX9A4e

    # ./password get -l 32 -s
    }d.sks(4J$2G]x52=k)WAN{M68LxEg}%
    ```

### Via API

- `/v1/getPassword` - Retrieve a password from the API
  - `length=20` - Specify the length of the password to generate
  - `special=false` - Set to `true` to enable special characters

#### Self-Hosted

1. Download the compiled binary from [Github releases](https://github.com/Luzifer/password/releases/latest)
2. Run the API server:

    ```bash
    # ./password serve -h
    NAME:
      serve - start an API server to request passwords

    USAGE:
      command serve [command options] [arguments...]

    OPTIONS:
      --port "3000"	port to listen on
    ```
3. Request your password using `http://localhost:3000/v1/getPassword?length=20&special=true`

#### Hosted

```bash
# curl https://pwd.luzifer.io/v1/getPassword?length=20&special=true
0M4L-1[lT:@2&7,p,o-;
```

## Benchmark / Test

Tests and benchmark are run by Travis CI at every push to this repository:

[![Build Status](https://travis-ci.org/Luzifer/password.svg)](https://travis-ci.org/Luzifer/password)

```bash
# go test -bench .
PASS
BenchmarkGeneratePasswords8Char           20000       74875 ns/op
BenchmarkGeneratePasswords8CharSpecial    10000      108451 ns/op
BenchmarkGeneratePasswords16Char          10000      135059 ns/op
BenchmarkGeneratePasswords16CharSpecial   10000      142958 ns/op
BenchmarkGeneratePasswords32Char           5000      307994 ns/op
BenchmarkGeneratePasswords32CharSpecial    5000      284031 ns/op
BenchmarkGeneratePasswords128Char           300     6721034 ns/op
BenchmarkGeneratePasswords128CharSpecial    500     3244446 ns/op
ok  	github.com/Luzifer/password/lib	13.764s
```