Use more appropriate URL base64 encoding and colon separators
#!/usr/bin/perl
use CGI::Fast qw/:cgi/;
-use Digest::SHA qw/hmac_sha256_base64/;
+use Digest::SHA qw/hmac_sha256/;
+use MIME::Base64 qw/encode_base64url decode_base64url/;
use Blerg::Database;
use URI::Escape;
use Mail::Message;
# generate verification data
my $expiry = time + 900;
- my $data = "$username;" . uri_escape($email) . ";$expiry";
+ my $email_b64 = encode_base64url($email);
+ my $data = "$username:$email_b64:$expiry";
# HMAC-SHA256 it
- my $hmac = hmac_sha256_base64($data, $hmac_key);
+ my $hmac = encode_base64url(hmac_sha256($data, $hmac_key));
- return Blerg::Database::BASEURL . "#/account/email-verify/$data;$hmac";
+ return Blerg::Database::BASEURL . "#/email-verify/$data:$hmac";
}
sub validate_email_data {
my ($data) = @_;
my ($payload, $hmac);
- if ($data =~ /^(.*);([^;]+)$/) {
+ if ($data =~ /^(.*):([^:]+)$/) {
$payload = $1;
$hmac = $2;
} else {
return undef;
}
- my $computed_hmac = hmac_sha256_base64($payload, $hmac_key);
+ my $computed_hmac = encode_base64url(hmac_sha256($payload, $hmac_key));
if ($hmac ne $computed_hmac) {
return undef;
}
- my ($username, $email, $expiry) = split(';', $payload);
- $email = uri_unescape($email);
+ my ($username, $email, $expiry) = split(':', $payload);
+ $email = decode_base64url($email);
if (time > $expiry) {
return undef;
}
#!/usr/bin/perl
use CGI::Fast qw/:cgi/;
-use Digest::SHA qw/hmac_sha256_base64/;
+use Digest::SHA qw/hmac_sha256/;
+use MIME::Base64 qw/encode_base64url/;
use Blerg::Database;
use strict;
use v5.10;
my $expiry = time + $validity;
my $counter = Blerg::Database::auth_get_counter($username)
or return undef;
- my $data = "$username;$expiry;$counter";
+ my $data = "$username:$expiry:$counter";
# HMAC-SHA256 it
- my $hmac = hmac_sha256_base64($data, $hmac_key);
+ my $hmac = encode_base64url(hmac_sha256($data, $hmac_key));
- return Blerg::Database::BASEURL . "#/recovery/$data;$hmac";
+ return Blerg::Database::BASEURL . "#/recovery/$data:$hmac";
}
sub validate_reset_data {
my ($data) = @_;
my ($payload, $hmac);
- if ($data =~ /^(.*);([^;]+)$/) {
+ if ($data =~ /^(.*):([^:]+)$/) {
$payload = $1;
$hmac = $2;
} else {
return undef;
}
- my $computed_hmac = hmac_sha256_base64($payload, $hmac_key);
+ my $computed_hmac = encode_base64url(hmac_sha256($payload, $hmac_key));
if ($hmac ne $computed_hmac) {
return undef;
}
- my ($username, $expiry, $counter) = split(';', $payload);
+ my ($username, $expiry, $counter) = split(':', $payload);
if (time > $expiry
|| $counter != Blerg::Database::auth_get_counter($username)) {
return undef;