seedproject-web/api/app/Helpers/Hash.php
Carlos Arias 1559ce017d chore: scaffold SeedProject base (Phase 1)
Clean-room copy of the reusable engines from comiida, with all
instance data, secrets, dependencies, and build output excluded:
- app/         Astro theme skeleton (no comiida blog posts; hero image -> placeholder)
- api/         SeedProject PHP framework (no vendor/.env/config.php)
- content-pipeline/  engine only (scripts/admin/prompts; empty runtime state)
- astroagent.config.json + app/.astroagent/skills

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SYHWLHihq3v9nxNwoPCKSn
2026-07-04 22:53:10 +00:00

67 lines
No EOL
2 KiB
PHP

<?php
class Hash
{
/**
*
* @param string $algo The algorithm (md5, sha1, whirlpool, etc)
* @param string $data The data to encode
* @param string $salt The salt (This should be the same throughout the system probably)
* @return string The hashed/salted data
*/
public static function create($algo, $data, $salt)
{
$context = hash_init($algo, HASH_HMAC, $salt);
hash_update($context, $data);
return hash_final($context);
}
public static function createApi(){
$key = implode('-', str_split(substr(strtolower(md5(microtime().rand(1000, 9999))), 0, 30), 6));
return $key;
}
public static function formData(){
$key = implode('-', str_split(substr(strtolower(md5(microtime().rand(1000, 9999))), 0, 15), 5));
return $key;
}
/**
* Normalize a date-of-birth string to YYYYMMDD for consistent hashing.
* Handles: YYYY-MM-DD (from HTML date input), MM/DD/YYYY, MMDDYYYY, YYYYMMDD.
*/
public static function normalizeDob($dob) {
if (empty($dob)) return '';
$dob = trim((string)$dob);
// Already YYYYMMDD
if (preg_match('/^\d{8}$/', $dob)) return $dob;
// YYYY-MM-DD (HTML date input)
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $dob)) {
return str_replace('-', '', $dob);
}
// MM/DD/YYYY
if (preg_match('/^\d{2}\/\d{2}\/\d{4}$/', $dob)) {
$d = \DateTime::createFromFormat('m/d/Y', $dob);
return $d ? $d->format('Ymd') : $dob;
}
// Fallback
$ts = strtotime($dob);
return $ts ? date('Ymd', $ts) : $dob;
}
/**
* Create a stable consumer profile ID from DOB + SSN.
* Returns first 32 chars of HMAC-SHA256.
*/
public static function createConsumerProfileId($dob, $ssn, $salt) {
$normalized = self::normalizeDob($dob) . preg_replace('/[^0-9]/', '', $ssn);
return substr(hash_hmac('sha256', $normalized, $salt), 0, 32);
}
}