NAME

Data::Passphrase::Graph - directed graphs for passphrase strength checking

SYNOPSIS

Object-oriented interface:

use Data::Passphrase::Qwerty;

my $graph = Data::Passphrase::Qwerty->new();
print $graph->has('qwerty');          # prints 1
print $graph->has('ytrewq');          # prints 1
print $graph->has('qazxdr');          # prints 1
print $graph->has('qwerfvgtrdxz');    # prints 1

use Data::Passphrase::Roman;

$graph = Data::Passphrase::Roman->new();
print $graph->has('abcdef');          # prints 1
print $graph->has('fedcba');          # prints 1
print $graph->has('xyzabc');          # prints 1
print $graph->has('cbazyx');          # prints 1

Procedural interface:

use Data::Passphrase qw(build_graph graph_check);

my $graph = build_graph 'qwerty';
print graph_check $graph, 'qwerty';          # prints 1
print graph_check $graph, 'ytrewq';          # prints 1
print graph_check $graph, 'qazxdr';          # prints 1
print graph_check $graph, 'qwerfvgtrdxz';    # prints 1

$graph = build_graph 'roman';
print graph_check $graph, 'abcdef';          # prints 1
print graph_check $graph, 'fedcba';          # prints 1
print graph_check $graph, 'xyzabc';          # prints 1
print graph_check $graph, 'cbazyx';          # prints 1

DESCRIPTION

This module provides a simple interface for using directed graphs with Data::Passphrase to find trivial patterns in passphrases.

Graph Format

Graphs are represented by hashes. Each node on the graph is a key whose value is a hash of adjacent nodes. So a bidirectional graph of the alphabet would contain the element

b => {a => 1, c => 1}

because each letter (b in this case) should be linked to both the previous letter (a) and the next letter (c). See "SYNOPSIS" and "EXAMPLES" for more examples.

OBJECT-ORIENTED INTERFACE

This module provides a constructor new, which takes a reference to a hash of initial attribute settings, and accessor methods of the form get_attribute() and set_attribute(). See "Attributes".

Normally, the OO interface is accessed via subclasses. For example, you'd call Data::Passphrase::Graph::Roman->new() to construct a graph of the alphabet. The inherited methods and attributes are documented here.

Methods

In addition to the constructor and accessor methods, the following special methods are available.

has()

$value = $self->has($word)

Returns TRUE if $word is contained by the graph, FALSE if it isn't.

Attributes

The following attributes may be accessed via methods of the form get_attribute() and set_attribute().

debug

If TRUE, enable debugging to the Apache error log.

graph

The graph itself (see "Graph Format").

PROCEDURAL INTERFACE

Unlike the object-oriented interface, the procedural interface can create any type of graph, specified as the argument to build_graph(). Then, graph_check() is used to determine if a word is contained by the graph.

build_graph()

$graph = build_graph $type

Build a graph of type $type. This subroutine will essentially construct a new object of the type

"Data::Passphrase::Graph::" . ucfirst $type

and return the graph itself for use with graph_check().

graph_check()

$value = graph_check $graph, $word

Returns TRUE if $word is contained by $graph, FALSE if it isn't.

EXAMPLES

The graph

a -> b -> c
^         |
`---------'

would be represented as

%graph = (
    a => { b => 1 },
    b => { c => 1 },
    c => { a => 1 },
);

Here's how to use it:

$graph = Data::Passphrase::Graph->new({graph => \%graph});
print $graph->has('abc');    # prints 1
print $graph->has('cba');    # prints 0
print $graph->has('cab');    # prints 1

AUTHOR

Andrew J. Korty <ajk@iu.edu>

SEE ALSO

Data::Passphrase(3)