Spaces:
Sleeping
Sleeping
const express = require("express"); | |
const axios = require("axios"); | |
const crypto = require("crypto"); | |
const fs = require("fs"); | |
const app = express(); | |
app.use(express.json()); | |
const PORT = process.env.PORT || 8080; | |
let apiCount = 0; | |
// Load the API count from a file on server start | |
fs.readFile("apiCount.txt", "utf8", (err, data) => { | |
if (!err) { | |
apiCount = parseInt(data); | |
} | |
}); | |
// Endpoint to check if a password is breached | |
app.post("/checkPassword", async (req, res) => { | |
try { | |
apiCount++; | |
const password = req.body.password; | |
if (!password) { | |
return res.status(400).send("Password is required"); | |
} | |
// Hash the password using SHA-1 | |
const sha1Hash = crypto | |
.createHash("sha1") | |
.update(password) | |
.digest("hex") | |
.toUpperCase(); | |
// Get the first 5 characters (prefix) of the hash | |
const prefix = sha1Hash.substring(0, 5); | |
// Query the Pwned Passwords API | |
const response = await axios.get( | |
`https://api.pwnedpasswords.com/range/${prefix}` | |
); | |
// Check if the password hash is in the response | |
const suffixes = response.data.split("\r\n"); | |
let breached = false; | |
let breachCount = 0; | |
suffixes.forEach((suffix) => { | |
const [hashSuffix, count] = suffix.split(":"); | |
if (prefix + hashSuffix === sha1Hash) { | |
breached = true; | |
breachCount = parseInt(count); | |
} | |
}); | |
// Return the result with api count | |
if (breached) { | |
res.json({ breached: true, breachCount, apiCount }); | |
} else { | |
res.json({ breached: false, apiCount }); | |
} | |
// Save the updated API count to the file | |
fs.writeFile("apiCount.txt", apiCount.toString(), (err) => { | |
if (err) { | |
console.error("Error saving API count:", err); | |
} | |
}); | |
} catch (error) { | |
console.error("Error:", error); | |
res.status(500).send("Internal Server Error"); | |
} | |
}); | |
app.listen(PORT, () => { | |
console.log(`Server is running on port ${PORT}`); | |
}); | |