- From: Brian Richter <brian@aviary.tech>
- Date: Sat, 13 Dec 2025 18:08:24 -0800
- To: Manu Sporny <msporny@digitalbazaar.com>
- Cc: Patrick St-Louis <patrick.st-louis@opsecid.ca>, Markus Sabadello <markus@danubetech.com>, public-credentials@w3.org
- Message-ID: <CAPUZd8uVs8U0Sxv+7=3iM7T2bSO4tNt7M25ZWb1D44yY+XH=gQ@mail.gmail.com>
Hi Manu, The did:webvh method is flexible in regards to portability in order to appease to IT departments that want to ensure domain binding. There is a *portable* flag that can be set to true to allow a DID to move to another domain but it has very strict requirements. Here they are pulled from the spec - Can *ONLY* be set to true in the first entry. - Defaults to false if omitted in the first entry. - Retains value if omitted in later entries. - Once set to false, *MUST NOT* be changed to true. Does that help with your uneasiness? After reading the did:cel spec I’m not totally clear what the heartbeat feature gives you. I get that it helps determine liveness but I don’t know if that is a problem I’ve heard people complain about. To me it feels like it’s bloating a log that already has the potential to get quite large. Can you explain the benefits of keeping an up to date heartbeat? Generally I’m glad to see this come around. I believe a standardized and generalizable cryptographic event log is powerful for many use cases and DIDs are just the tip of the iceberg. Thanks, Brian On Sat, Dec 13, 2025 at 1:26 PM Manu Sporny <msporny@digitalbazaar.com> wrote: > On Fri, Dec 12, 2025 at 11:53 AM Patrick St-Louis > <patrick.st-louis@opsecid.ca> wrote: > > Having worked extensively on implementing webvh in a production > environment, I would like to clarify some points. I agree with most of what > was said, however some points are not representative of features provided > by webvh. > > Great, thank you for chiming in with corrections, Patrick! I've been > meaning to learn more about did:webvh and this is a good exercise to > do so. > > Can you be more specific about "production environment" -- any > deployment numbers you can share? Just trying to get an idea of the > scale at which did:webvh is operating. Any lessons learned that would > be helpful to the broader community? > > > I'm not sure backwards compatibility is the appropriate term, but you > can certainly publish a parallel did:web by following the specification. > > The way I first learned about did:webvh was as a "fully backwards > compatible set of extensions to did:web". Which means, if someone used > a "did:web:domain.example" identifier, they wouldn't have to change it > at all, but would benefit from did:webvh's additional features. I > probably misunderstood what the actual proposal was, which was the > "parallel" path you mentioned, and not the more unified path I had > imagined. > > This has consequence to some of the production systems we're involved > with, which used "did:web" and I was imagining that we could tell > those customers: "You can keep using your same did:web identifier, but > now there are optional and additional layers of security you can > depend on for higher-security use cases." -- but what it sounds like > you're saying is that it was never on the table as an option... you > have to switch over to the new identifier format, which means they > might as well be switching to an entirely different DID Method and now > we can't tell their IT teams that they're fully in control of their > identifier as a result of their control over the domain, which is > something these IT teams are very comfortable with. > > I don't think they will be very comfortable with the notion that the > domain-based identifier isn't tied to the domain which they control. > One of the strongest arguments for did:web was the "You control the > domain, and therefore you control the DID, always." line. Some of the > customers we have are going to be very hesitant to move away from that > model, and I was hoping we'd be able to ratchet up the security with > did:webvh up without giving up that notion of "domain lock" (in a good > way). > > > This can address scenarios such as: > > - An organization using did:web who wants to upgrade to webvh, > benefiting from the features of being able to detach from their domain in > the long run without losing their permanent identifier. > > Yes, but that's an anti-feature to some of these organizations... > namely people in their IT security teams. They are comfortable with > domain-based identifiers and removing that from the security model is > viewed as a negative thing, at least for the time being. It might take > years for these more conservative organizations to become comfortable > with their "identity" being detached from their domain. > > > > did:cel has a heartbeat mechanism to prevent historical forking and/or > log truncation/rollbacks, did:webvh does not. > > > > WebVH doesn't implement a heartbeat functionality, it instead has 2 > features which each on their own can prevent forking, witnessing threshold > and pre-rotation. This being said, a heartbeat functionality would be > trivial to add, and would be super effective in conjunction with > pre-rotation. Currently, a controller can implement its own "heartbeat > mechanism" by publishing a new log entry on a regular basis. > > I don't think that's right -- unless you have a rule that says: "The > DID Document is deactivated unless updates are made every N time > units", you have the risk of rolling back history to the time of a > compromised key (in the past, when the document existed on an old, > compromised domain), even with witnessing thresholds and pre-rotation. > > You can execute this attack just by compromising the web server. With > did:webvh, watchers are the only thing that could detect this sort of > rollback, but then that's extra infrastructure that you need with > did:webvh that you don't need with did:cel... and even if you have > watchers, you are not guaranteed that someone is watching the > particular DID you're interested in... which might be the common case > (for individuals), because the vast majority of verifiers in the world > probably don't care about your personal DIDs, until you use them, and > when you use them, no one had been watching your DID history. > > Yes, did:webvh could add this functionality, just like did:cel could > add all of did:webvh's functionality, but there seem to be differing > philosophies at play here. I don't think did:cel has a need for > witnesses that see every transaction, nor watchers, as a core part of > the system. > > > > did:webvh has pre-rotation commitments, which might address attack > windows after the latest heartbeat present in did:cel (unless the > pre-rotation key is compromised). > > > > I disagree that a compromised pre-rotation key in itself is a sufficient > attack vector. > > Ah, I wasn't saying that... I was trying to say: This is a place where > did:webvh has a clear advantage over did:cel, so perhaps we should > look into pre-rotation commitments as a part of did:cel. That is, get > rid of using the authorizationMethod to sign the transaction, and just > include a pre-rotation secret. I hesitate to say that the pre-rotation > secret should be a key as then you have to manage the rotation of > hundreds to thousands of keys, and with commercial hardware HSMs, that > can get expensive. So expensive, that I expect implementers will move > the secret management out of the HSM and make their system more > vulnerable to attack. That said, need to think about this more as that > might not be the case. > > > Furthermore, keys are segmented for their use cases, as opposed to > did:cel, where the same key is used to sign the logs and as a verification > method. It gives more power to a compromised key. > > Yes, I agree that's a weaker position than I'd like for did:cel and > agree that did:webvh's segmented key use is probably a better approach > (as you know, these things are not difficult to change). I'm > questioning whether the pre-rotation secret needs to be a key, > though... or just a secret of some kind. I'm also wondering if it > matters -- the real power is in the pre-commitment to the recovery > key, which can (in theory) undo the sorts of attacks we are talking > about... so why bother with a per-event pre-rotation key... it's more > to manage, more complexity, possibly resulting in a weaker security > profile around the key (due to commercial cost), when you could just > commit to an offline recovery key and leave it at that. > > >> What I would prefer is for did:webvh to commit to a single root of > trust, the domain, if you lose your root of trust, you have lost control of > your DID. > > > > AFAIK this is what webvh wanted to address from the start, preventing > committing to the domain as the root of trust. The point of webvh is to > initiate your log (create the did), then have the log history carry the > identifier (SCID) across domains in a detached operation if need be, while > preserving authenticity. > > Yes, well this was clearly a misunderstanding on my part. I thought > some of the goals of did:webvh was around upgrading the trust that the > domain really does contain the appropriate did:web document, and to > enable history on that did:web. What I'm learning now changes my > understanding of did:webvh significantly... it's more like did:cel > than I had thought, but loses some key features of did:web that feel > like they're going to create a customer problem for us. > > > Something else to add, with webvh, the witness proofs are kept separate > from the log file. This was designed to improve performance on larger logs, > since the witness file can be truncated without affecting the authenticity > of the log history. > > > > With did:cel, depending on the size of the history, there will be a > performance impact. It would be great to compare performance results of did > cel with what was calculated through webvh benchmarks. > > The use of jsonl for the webvh log also enables streaming the log which > is another performance improvement over larger json files. > > We've done little benchmarking, but what we have done has convinced us > of a few things: > > 1. There is no need for a binary format for the log. > > 2. The JSON-lines based approach doesn't provide a significant > performance boost (and requires state to provide a performance boost, > which did:cel tries to NOT require). > > 3. We've simulated 30+ years of key rotations (every 3 months) and > heartbeats on a DID Document (without key removals), which results in > a gzip'd log file of around 46KB for an individual, and around 604KB > for a government agency. The government agency one is probably a bit > off because it has over 240 keys in the DID Document over that period, > when in reality, keys would be removed over time. We need to implement > key removal after rotation for did:cel before we get to some more > realistic numbers... but neither of those file sizes or download sizes > seem very scary... and that's without any sort of optimization. > > > As for the series of questions about webvh and scids and how verifiers > should build their software around it, these could be better answered > during a working group call. I would be happy to share our approach, as I'm > sure other implementers will be. > > Yes, I agree that diving deep into all of this would be a good next > step... especially once the DID Methods WG has been spun up. > > > Thank you for providing this detailed overview as a start to the > conversation, hopefully some of these misconceptions can be ironed out. > > Yes, and thank you for engaging in the conversation as well and > clearing up some of those misconceptions. I really appreciate it, > Patrick. :) > > -- manu > > -- > Manu Sporny - https://www.linkedin.com/in/manusporny/ > Founder/CEO - Digital Bazaar, Inc. > https://www.digitalbazaar.com/ > >
Received on Sunday, 14 December 2025 02:08:40 UTC