ChromeLock security review
ChromeLock review: what does its password actually protect?
ChromeLock 3.28.5 puts a password screen in front of Chrome, but does not encrypt your saved Chrome profile. With browser debugging enabled, removing ChromeLock removed that password barrier and the site remained signed in.
Version reviewed: ChromeLock 3.28.5. The evidence section identifies the exact package and SHA-256. The review separates what the code proves from behavior reproduced in Chrome.
On this page
What protection do you actually get?
ChromeLock 3.28.5 can stop ordinary use of Chrome while its lock is running. Its password does not encrypt your saved Chrome profile. With browser debugging enabled beforehand, ChromeLock was removed while its lock was active; after restart, the extension was gone and the site was still signed in.
| Question | Answer in version 3.28.5 |
|---|---|
| Does it ask for a password before resuming normal browsing? | Yes. The ordinary unlock path checks the password before restoring tabs. |
| Does that password encrypt the Chrome profile? | No. ChromeLock does not encrypt Chrome history, cookies or saved passwords with its password. |
| Does its password still protect the saved profile after ChromeLock is removed? | No. Chrome and the operating system may still apply their own protections, but those are separate from the ChromeLock password. |
Who are you protecting the browser from?
Someone else sits down at your computer while you are still signed in to it. They do not know the ChromeLock password. What can they open?
- They try to use Chrome normally. ChromeLock can put its password window in front of ordinary browsing while the lock is active.
- They try Chrome's extension controls. A normal foreground attempt to open extension management was blocked.
- They use additional tools from the same computer account. The successful disable/removal tests used browser debugging to reach Chrome extension management without entering the ChromeLock password.
What happens when you lock and unlock Chrome?
- Capture: ChromeLock collects window information and tab URLs, titles, order, pinned state and active state.
- Save: it writes that information to local extension storage.
- Lock: it opens its own password window and closes the captured normal tabs and windows. While locked, it watches for new windows and tabs and also runs a cleanup every two seconds.
- Unlock: it checks the entered password, stops lock enforcement and recreates windows and tabs from the saved URLs.
ChromeLock can run this lock at startup, on demand or after you have been idle. That gives you more chances to put a password in front of Chrome. There is no separate companion app or file-encryption layer in this package, so the ChromeLock password is not required to open the saved profile if ChromeLock itself is disabled or removed.
Does it keep the locked browser out of sight?
No. The password screen remains visible. It blocks the pages from ordinary view, but it does not hide that Chrome is locked.

A visible lock and keeping a private space out of sight are separate requirements.
What happens if the extension is disabled or removed?
With browser debugging enabled beforehand, ChromeLock was removed while its password screen was active, without entering its password. After restarting the browser, the extension was gone and the site was still signed in.
Trying to reach Chrome's extension manager through ordinary foreground browsing was blocked. The successful removal used the already-enabled debugger to reach that manager, where Chrome's standard Remove dialog performed the removal.
| Action from an active lock | Observed result |
|---|---|
| Open Chrome's extension manager in the foreground | Blocked. The active lock closed the foreground management attempt. |
| Disable through debugger-assisted Chrome management | Disabled. Chrome reported the extension disabled without the ChromeLock password. |
| Reach Chrome's extension-management UI with debugger access and remove ChromeLock | Removed. Chrome showed its standard Remove dialog; the extension remained absent after a normal restart. |
| Open the saved verification state afterward | Accessible. The site was still signed in after the extension was removed. |
How the disable/remove check was run
The completed user-modifiable removal run used Chromium 144.0.7559.96 on Debian GNU/Linux 13 with ChromeLock 3.28.5 under its production extension ID. The lock was active before removal, and Chrome displayed its standard removal confirmation.
Reaching extension management in that run required an already-enabled debugger connection. This identifies the capability used to get around the foreground lock; it does not change the architectural result that the ChromeLock password is not a decryption requirement for the saved profile after the extension is gone.
Chrome can impose separate enterprise policy that prevents users from modifying an extension. That administrative boundary comes from Chrome management, not from the ChromeLock password.
What does the ChromeLock password protect if ChromeLock is not running?
Nothing extra in the saved Chrome profile. Chrome and the operating system do not use the ChromeLock password when opening Chrome's saved data. Chrome and the OS may still protect particular secrets in their own ways, but those protections do not come from ChromeLock.
For example, Chrome introduced App-Bound Encryption on Windows beginning with cookies in Chrome 127. The absence of an additional extension layer does not mean every browser secret is plain text, or that a copied cookie or password database can necessarily be decrypted or reused.
Would fixing every bug make its password protect the saved profile?
No—not by fixing the password screen alone. Fixes can make the lock more reliable, but protecting the saved profile after ChromeLock stops requires a separate mechanism that protects the data itself.
| Improvement | What it improves | What it does not add by itself |
|---|---|---|
| Reliable startup locking | Consistent enforcement of the browser-lock workflow. | Protection for profile contents outside that workflow. |
| Safer password storage and recovery | Protection for the extension's own credentials and control operations. | Encryption of history, cookies or saved passwords in Chrome's profile. |
| Automatic and manual locking | A barrier to ordinary use of an unattended browser. | Protection that persists independently of the extension's enforcement. |
| Encryption of the saved tab list | Confidentiality of that particular copy of tab metadata. | Encryption of the rest of Chrome's stored profile. |
An extension can be part of a larger system that protects browser data with a separate native app or encryption layer. ChromeLock 3.28.5 does not do that here: it controls Chrome windows and tabs. Making its password protect the saved profile would require a different data-protection layer, not just a better lock screen.
Will I still be signed in after unlocking?
The site stayed signed in after ChromeLock locked on startup and we entered the correct password. We returned to the same page without signing in again; its saved site data was still present.

What happens to open tabs? ChromeLock closes and reloads pages. It restores URLs and tab metadata, not live page memory or unsaved form contents. Restored windows are maximized instead of using their saved dimensions and position.
How this sign-in check was run
Reviewed September 25, 2026 with the fingerprinted ChromeLock 3.28.5 CRX under its production extension ID in an isolated Chromium 144.0.7559.96 profile on Debian GNU/Linux 13. The site set a 24-hour session cookie and a saved site value in localStorage.
Coverage: one local cookie-based login and one localStorage value. The expected MD5 password verifier was seeded directly for this run; the actual startup auto-lock and password screen were then exercised normally.
Need to keep your accounts signed in on a shared computer?
If you need to keep accounts signed in while keeping other people out, compare browser-protection options for a shared computer.
If the space itself must stay out of ordinary view, see locking a profile versus hiding its existence.
Other weaknesses in version 3.28.5
The following are additional weaknesses in this version.
Are the saved tab URLs and titles encrypted?
No. ChromeLock stores the tab metadata as a JSON-serialized value in chrome.storage.local without encryption derived from the ChromeLock password. Its helper calls JSON.stringify on the saved object: URLs, titles, tab order, pinned and active flags, window information and a timestamp.
Anyone who can read this stored value can decode the tab metadata without the ChromeLock password. Reading it still requires access to the extension's storage. This describes the value written through the API, not Chrome's physical file format on disk.
How is the password stored?
Someone who copies ChromeLock's saved password-check value can test password guesses outside the lock screen. ChromeLock stores that value as an unsalted MD5 hash.
There is no per-password salt or deliberately slow password-hashing step. The security-question answer uses MD5 too, after trimming leading and trailing whitespace.
MD5 is fast, so each offline guess is cheap to test. A strong random password can still have many possible guesses, but ChromeLock adds no deliberate computational cost to each attempt. OWASP recommends password-hashing schemes such as Argon2id.
Does the five-minute lockout protect against password guessing?
It limits guesses through the normal unlock handler. Three failed password attempts set a five-minute lockout. During that interval, the handler refuses another password check. After the interval, it resets the failed-attempt counter.
It does not limit offline guesses against a copied MD5 verifier. Those comparisons happen outside ChromeLock, so its counter and timer do not participate. This is why the interface lockout does not compensate for the password-storage design.
Can someone reset the password without the current one?
With debugging access to ChromeLock's own password page, the lock password was changed without entering the old password or answering the security question. The normal unlock screen then accepted the replacement password.
The recovery screen asks for a security answer, but the background operation that changes the password does not require proof that this check succeeded.
This result required access to the extension's internal page through a debugger. It is not a route exposed to ordinary websites.
The question-verification handler also does not use the failed-attempt counter or lockout check used by normal password entry. The five-minute password lockout is not a general restriction on all recovery operations.
Without a security question, timed recovery offers a wait of one, three or seven days (default: three). Its background reset operation does not independently verify expiry. It clears lock credentials and saved tab metadata, disables enforcement and opens a new tab.
The message-routing and handler details are in the technical evidence.
The lock did not come back after its background process restarted
After we deliberately stopped and restarted ChromeLock's background process using debugging tools, the lock did not come back. New tabs that the active lock had closed before the stop stayed open afterward; in the repeat run, the saved browser state was readable without unlocking.
The code saves lock state, but that alone does not reinstall enforcement. Window and tab listeners and the cleanup interval are enabled by the lock/restore path. The browser-startup handler can restore that path; an ordinary worker restart is not a browser-startup event. The experiment shows that the stored locked flag did not guarantee active enforcement through this transition.
The first result used a deliberate debugging command to stop the background process. It does not establish a wait-only bypass, a fixed time-to-bypass or failure on every restart. Background-process restart is also different from disabling or uninstalling the extension.
How does that compare with the product description?
| Product description | What version 3.28.5 actually does |
|---|---|
| Password protection for the browser | Implements a password-controlled window and session-restoration workflow. |
| Protection for browsing history, saved passwords and tabs | Closes ordinary browsing windows. It does not encrypt the underlying Chrome stores with its password or change their file permissions. |
| “Your password is encrypted before storage” | Stores an unsalted MD5 hash of the lock password. Hashing is not encryption, and MD5 is not a suitable modern password-storage scheme. |
The Chrome Web Store description is technically incorrect on this point: hashing and encryption are different operations. Version 3.28.5 hashes the password with MD5; it does not encrypt the password.
Runtime validation
The security-boundary experiments used a non-administrator Windows profile in Chrome for Testing 153.0.8010.52 with the distributed package loaded unpacked and its executable code unchanged. A separate completed removal check used Chromium 144.0.7559.96 on Debian GNU/Linux 13 with ChromeLock installed under its production extension ID.
Each active-lock management case began with the Browser Locked window active. Foreground extension-management navigation was blocked. Debugger-assisted management reached Chrome controls without submitting the ChromeLock password; the completed removal run then used Chrome's standard Remove confirmation dialog.
The saved profile state consisted of a persistent cookie, a localStorage value and, in the Windows checks, a seeded history entry. It remained readable after disable/removal and after restart. These results concern those saved items rather than every possible browser store or account.
Vendor networking and real credentials were excluded. Debugger access is a stronger same-user capability than ordinary foreground browsing, and the article identifies it explicitly where the management result depends on it.
Package and evidence
The complete CRX was downloaded directly from Google's extension update service on September 19, 2026. It is byte-for-byte identical to the package used for the earlier article. Its manifest declares version 3.28.5. The package contains 98 files, including 22 JavaScript files.
| Item | Value |
|---|---|
| Extension | ChromeLock |
| Extension ID | dfncaoemjmmnbcfldoochfgkhenhegjl |
| Version | 3.28.5 |
| CRX SHA-256 | 3f3aaa2aeee4a29b73fde90ddbce171b4490628c400586c569e1fa83f07da6f6 |
| Method | Distributed-package analysis and the explicitly scoped browser experiments above. |
Download ChromeLock from Google's update service · Chrome Web Store listing. The update service can return a newer release later; compare the manifest version and SHA-256 before reproducing this review.
All 22 JavaScript files were parsed for inspection. The review traced the manifest and HTML entry points, window capture and restoration, the storage helper, password setup and verification, the failed-attempt counter, recovery screens, background message dispatch and reset handlers. Bundled cryptographic functions were distinguished from functions actually called by the lock workflow. Network call sites and local-service references were checked for delegation of profile encryption or file access control.
| Finding | Code to inspect in this package |
|---|---|
| Interface locking and URL restoration | services/task/controller.7bfeabe5.js: lockBrowser, unlockBrowser, captureCurrentState, restoreWindowsAndTabs, enableProtectionMode. |
| Unencrypted saved tab metadata | The same worker: saveWindowState, getSavedWindowState, key browser_lock_saved_state, and the storage helper calling JSON.stringify and storage.local.set. |
| MD5 password and security-answer verifiers | Worker module 12006: md5Hash, hashPassword, verifyPassword, hashSecurityAnswer, verifySecurityAnswer; follow the calls from setup and unlock. |
| Three attempts and a five-minute lockout | Worker: recordFailedAttempt, isTemporarilyLocked, resetFailedAttempts, and their calls in unlockBrowser. |
| Recovery authorization gaps | Worker: LOCK_VERIFY_SECURITY, LOCK_RESET_PASSWORD, LOCK_PERFORM_AUTO_RESET and message dispatch. Lock UI: drivers/pool/gateway.7bfeabe5.js, verifySecurityAnswer and resetPassword. |
| No profile encryption or OS file isolation | manifest.json, the package inventory, and the password, storage and window-control paths above. The worker request helper uses https://platform.chromelock.net; these security operations do not delegate to a local service. |
Code excerpts — password setup and verification use MD5
Source: services/task/controller.7bfeabe5.js in the fingerprinted package above. Captions use one-based lines from Prettier 3.6.2's Babel formatting with default options. Only formatting and indentation were changed; names and statements are unchanged. Separate extracts omit intervening code.
kt imports module 12006 at formatted line 23929. Setup hashes and saves the password; validation compares it with the saved verifier. The module defines the MD5 operation used by both.
case 3:
return (
(r = kt.default.hashPassword(e)),
(t.next = 6),
this.stateManager.savePasswordHash(r)
);
case 6:
return t.abrupt(
"return",
kt.default.verifyPassword(e, r),
);
{
key: "md5Hash",
value: function (t) {
return t ? o().MD5(t).toString() : "";
},
},
{
key: "verifyPassword",
value: function (t, e) {
return !(!t || !e) && this.md5Hash(t) === e;
},
},
{
key: "hashPassword",
value: function (t) {
if (!t || t.length < 1)
throw new Error("Password cannot be empty");
return this.md5Hash(t);
},
},
Code excerpts — recovery dispatch and password change
Source: services/task/controller.7bfeabe5.js in the fingerprinted package above. Captions use one-based lines from Prettier 3.6.2's Babel formatting with default options. Only formatting and indentation were changed; names and statements are unchanged. Separate extracts omit intervening code.
Internal runtime.onConnect registration and delivery handling are at lines 23806–23875. The bridge checks destination routing before dispatch. Its callback records delivery against the registered endpoint fingerprint; that fingerprint identifies a bridge connection, not a successful recovery check.
if (
s.destination.context === t &&
!s.destination.frameId &&
!s.destination.tabId
) {
null == r || r(s);
const { transactionId: e, messageID: n, messageType: c } = s,
(t) => {
const e = nt(
J(
J({}, t.origin),
"window" === t.origin.context && {
context: "content-script",
},
),
),
r = ht.get(e),
n = {
message: t,
to: yt,
from: { endpointId: e, fingerprint: r.fingerprint },
};
mt(e).withFingerprint(r.fingerprint).aboutSuccessfulDelivery(n);
},
const r = i.get(n);
if ("function" != typeof r)
throw (
(o = !0),
new Error(
`[webext-bridge] No handler registered in '${t}' to accept messages with id '${n}'`,
)
);
e = await r({
sender: s.origin,
id: n,
data: s.data,
timestamp: s.timestamp,
});
onMessage registers handlers directly in map i (line 23718); xt is its alias (23876). LOCK_RESET_PASSWORD is registered at 31388. The reset handler below imports module 12006, hashes the new password and saves it. The separate LOCK_VERIFY_SECURITY handler (31330–31386) returns the answer comparison result without creating an authorization token or authenticated recovery state.
case 0:
return (
(n = e.data),
(o = n.password),
(i = n.securityQuestion),
(a = n.securityAnswer),
(s = _e()),
(t.next = 5),
Promise.resolve().then(r.bind(r, 12006))
);
case 5:
return (
(c = t.sent.default),
(u = c.hashPassword(o)),
(t.next = 9),
s.stateManager.savePasswordHash(u)
);
The be wrapper at 30804–30819 advances an async generator; it adds no recovery check. These extracts document the unchanged code path exercised from the extension lock page in the debugger-assisted recovery run. The result applies to that extension-page execution context, not to arbitrary outside callers.