Anonymous credentials provide a powerful tool for making assertions about identity while maintaining privacy. However, a limitation of today’s anonymous credential systems is the need for a trusted credential issuer — which is both a single point of failure and a target for compromise. Furthermore, the need for such a trusted issuer can make it challenging to deploy credential systems in practice, particularly in the ad hoc network setting (e.g., anonymous peer-to-peer networks) where no single party can be trusted with this responsibility. In this work we propose a novel anonymous credential scheme that eliminates the need for a trusted credential issuer. Our approach builds on recent results in the area of electronic cash that, given a public append-only ledger, do not need a trusted credential issuer. Furthermore, given a distributed public ledger, as in, e.g., Bitcoin, our system requires no credential issuer at all and hence is decentralized. Using such a public ledger and standard cryptographic primitives, we propose and provide a proof of security for a basic anonymous credential system that allows users to make flexible identity assertions with strong privacy guarantees without relying on trusted parties. Finally, we discuss a number of practical applications for our techniques, including resource management in ad hoc networks and prevention of Sybil attacks. We implement our scheme and measure its efficiency.
Anonymous credentials provide a powerful tool for making assertions about identity while maintaining privacy. However, a limitation of anonymous credential systems is the need for a trusted credential issuer — which is both a single point of failure and a target for compromise.
In this paper, the authors propose a novel anonymous credential scheme that eliminates the need for a trusted credential issuer. Given an append-only decentralized ledger (e.g., Bitcoin), this scheme requires no credential issuer at all and hence it is decentralized.
Paper’s Contribution
Decentralized Anonymous Credential System: Propose anonymous credential systems without needing a trusted and central credential issuer. To achieve this goal, the protocol requires the existence of a public append-only ledger.
This ledger is maintained in a distributed manner that need not require a trusted party or parties. (Best possible implementation is blockchain)
The identity claims used in issuing credentials must be verifiable by everyone participating in the system.
The paper shows how to extend the proposed credential scheme to create updatable (e.g., stateful) anonymous credentials in which users obtain new credentials based on changing properties of their identity.
The authors also show several immediate applications of Decentralized Anonymous Credentials
Decentralized Direct Anonymous Attestation (dDAA): To decentralize the Direct Anonymous Attestation protocol, allowing individual collections of nodes in an ad hoc or distributed system to securely assert properties of their system state.
Anonymous resource management in ad hoc networks: Peer-to-peer networks are vulnerable to impersonation attacks, where a single party simulates many different peers in order to gain an advantage against the network. The basic approach to mitigate those attacks is to construct an anonymous subscription service where parties may establish unique or costly pseudonyms (for example by submitting a valid TPM (Trusted Platform Module) credential or paying a sum of digital currency). They can then assert possession on their identity under a specific set of restrictions, e.g., a limit to the number of requests they can make in each time period (k-show credentials).
Auditable credentials: These techniques may also be used to extend existing centralized credential systems by allowing for a public audit of issued credentials. This helps to guard against compromised credential issuers and allows the network to easily detect and revoke inappropriate credential grants. For example, in Direct Anonymous Attestation (DAA) one might want to prevent a malicious DAA authority from granting certificates to users who do not have a TPM or whose TPM did not attest.
Overview of the Construction
Issuing the credentials:
The user establishes an identity and corresponding attributes
The user attaches a vector commitment to her secret key skU, along with the identity and attribute strings contained in its identity assertion.
Example:
Identity: Validator public key or validator index
Attributes: missed_attestations, missed_blocks, etc.
Identity assertion: To show Authenticity proofs obtained from Oracles for accessing attributes
The user includes a non-interactive proof that the credential is correctly constructed. The network will accept the identity assertion iff the assertion is considered correct and the proof is valid.
Showing Credentials:
The user proves the following statements in Zero-Knowledge -
The user knows a commitment Ci in the set (C1,C2,…,CN) of all credentials previously accept
The user knows the opening (randomness) for the commitment.
The user proves additional statements about the identity and attributes contained within the commitment Ci.
Decentralized Anonymous Credentials
A traditional anonymous credential system has two types of participants: users and organizations.
Notations:
User secret key: skU
The pseudonym of user A to organization O: NymAO
Credential: c
Set of the credentials issued by the Organization: CO
The auxiliary information (for example, identity assertion, organization name, etc): aux
Note: In decentralized anonymous credentials no single party represents the organization. Instead, a quorum of users who enforce a specific credential-issuing policy and collaboratively maintain a list of credentials issued so far.
The distributed anonymous credentials consist of a global distributed ledger, a list of transaction semantics, and the following algorithms (possibly probabilistic) -
Setup(1λ)→params : Generates the system parameters.
KeyGen(params)→skU: Run by a user to generate her secret key.
FormNym(params,U,E,skU)→(NymUE,skNymUE,U,E): Run by a user to generate a pseudonym NymUE and an authentication key skNymUE between a user U and some entity (either a user or an organization) E.
Run by a user to generate a request for a credential from the organization O.
The request consists of a candidate credential c containing public attributes attrs; the user’s key skU; auxiliary data aux justifying the granting of the credential (e.g., authenticity proofs from Oracles)
a proof πM that (1) NymUO was issued to the same skU and (2) the credential embeds attrs.
MintVerify(params,c,NymUO,aux,πM)→{0,1}: Run by nodes in the organization to validate a credential. Returns 1 if πM is valid, 0 otherwise.
Show(params,skU,NymUV,skNymUV,c,skc,CO)→πS : Run by a user to non -interactively prove that a given set of attributes are in a credential c in the set of issued
credentials CO and that c was issued to the same person who owns NymUV . Generates and returns a proof πS.
ShowVerify(params,NymUV,πS,CO)→{0,1}: Run by a verifier to validate a shown credential. Return 1 if πS is valid for NymUV , 0 otherwise.
The description of how these algorithms are used in the decentralized anonymous credentials
A. Overview of the Protocol Semantics
In this system, authors integrate the above algorithms with a decentralized hash chain network (Blockchain) as follows.
Formulating a pseudonym: Generated by the user offline
The user U generates its secret key skU.
A pseudonym NymUO for use with an organization O.
Obtaining a credential:
The user includes the public identity assertion into the aux
She executes the MintCred routine to obtain a credential and a signature of knowledge (SoK) on aux.
She then formulates a transaction including both the resulting credential and the auxiliary data and broadcasts it into the blockchain network.
The network nodes verify the correctness of the credential and the identity assertion using the MintVerify routine and auxiliary data.
Showing a credential:
The user collects a set of credentials CO and verifies them using MintVerify routine and validates auxiliary identity certification contained in aux (e.g., authenticity proofs from oracles for proving the performance of validator). She runs the Show routine.
The Verifier also collects the set of credentials in CO and validates the credential using the ShowVerify routine.
B. Trusting the Ledger
Why is the append-only transaction ledger necessary?
If the list of valid credentials can be evaluated by a set of untrusted nodes, then a user (Prover) could simply maintain a credential list compiled from network broadcasts and provide this list to the Verifier during a credential show. Although the credentials are valid by issuing party (not broadcast to anyone else), a malicious Verifier manipulates the Prover’s view of the network to include a poisoned-pill credential. Since the distributed ledgers (e.g., Bitcoin, Namecoin, etc) provide a shared view among a large number of nodes (users) can solve the above problem.
Preliminaries
A. Complexity Assumptions
Strong RSA Assumption: Given a randomly generated RSA modulus n and a random element y∈Zn∗, it is hard to compute x∈Zn∗ and e>1, s.t. xe≡y (mod n). The RSA modulus can be restricted to the form n=pq, where p=2p′+1 and q=2q′+1 are safe
primes.
Discrete Logarithmic (DL) Assumption: Let G be a cyclic group with generator g. Given h∈G, it is hard to compute x such that h=gx.
B. Cryptographic Building Blocks
Zero-knowledge Proofs:
The notation NIZKPoK{(x,y):h=gx∧c=gy} denotes a non-interactive zero-knowledge proof of knowledge of the elements x and y that satisfy both h=gx, c=gy.
When these proofs are used to authenticate auxiliary data, the resulting non-interactive proofs are called signatures of knowledge. The signature of knowledge on message m is denoted as ZKSoK[m]{(x,y):h=gx∧c=gy}.
Accumulators: The construction of these decentralized anonymous credentials uses accumulators on string RSA assumption.
AccumSetup(λ)→params: On input a security parameter, it outputs params(N,u). First samples primes p,q (polynomial dependence on the λ) and compute N=pq. Second, samples u∈QRN, u=1.
Accumulate(params,C)→A: On input params(N,u) and a set of prime numbers C={c1,c2,…,cn∣ci∈[A,B]}, compute the accumulator A=uc1c2…cn mod N.
GenWitness(params,v,C)→w: On input (N,u) and a set of prime numbers C, and a value v∈C, the witness w=Accumulate(params,C╲{v}).
AccVerify(params,A,v,ω)→{0,1}: compute A′=wv mod N and output 1 iff A′=A.
Incrementally updated: Given an existing accumulator An it is possible to add an element x and produce An+1=Anx mod N.
Collision-resistance: Under strong RSA assumption, no PPT adversary can produce a pair (v,w) such that v∈/C and yet AccVerify is satisfied.
zero-knowledge proof of knowledge: To prove a committed value is in an accumulator (Accumulator membership proof).
NI−ZKPoK{(v,ω):AccVerify((N,u),A,v,ω)=1}
Verifiable Random Functions (VRF): A pseudorandom function (PRF) https://dl.acm.org/doi/10.1145/6490.6503 is an efficiently computable function whose output cannot be distinguished (with non-negligible advantage) from random by a computationally bounded adversary. Authors denote the pseudorandom function as fk(⋅), where k is a randomly chosen key. VRFs possess efficient proofs that a value is the output of a VRF on a set of related public parameters.
Pedersen Commitments: The public parameters are a group G of prime order q, and set of generators (g0,g1,g2,…,gm).In order to commit to the values (v1,v2,…,vm), pick a random r∈Zq∗ and compute
C=PedComm(v1,v2,…,vm;r)=g0ri=1∏mgivi
A CONCRETE INSTANTIATION
Setup(1λ)→params: On input a security parameter, AccumSetup(λ) and generate (N,u). Next, generate primes p,q such that p=2wq+1 for w≥1. Let G be an order-q subgroup of Zp∗ , and select random generators (g0,…,gn) such that G=⟨g0⟩=⋯=⟨gn⟩. Output params=(N,u,p,q,g0,…,gn).
KeyGen(params)→sk: On input a set of parameters params, select and output a random master secret sk∈Zq.
FormNym(params,sk)→(Nym,skNym): Given user’s secret key sk, select a random r∈Zq∗. Compute Nym=g0rg1sk and set skNym=r. Output (Nym,skNym).
MintCred(params,sk,NymUO,skNymUO,attrs,aux)→(c,skc,πM): Given a nym NymUO and its secret key skNymUO; attributes attrs=(a0,a1,…,am)∈Zqm; and auxiliary data aux, select a random r′∈Zq and compute c=g0r′g1sk∏i=0mgi+2ai s.t. {c∣c∈[A,B]}, set skc=r′ and output (c,skc,πM). Where πM is a signature of knowledge on πM that the nym and the credential both belong to the same master secret sk , i.e.:
submit (c,πM,attrs,NymUO,aux) to the public transaction ledger.
MintVerify(params,c,attrs,NymUO,aux,πM)→{0,1}: verify that πM is the signature of knowledge on aux. If the proof verifies successfully, output 1, otherwise output 0. The organization nodes should accept the credential to the ledger iff this algorithm returns 1.
Show(params,sk,NymUV,skNymUV,c,attrs,skc,CO)→πS : Compute A=Accumulate(params,CO) and w=GenWitness(params,c,CO). Output the following proof of knowledge:
Then, verify that πS is the aforementioned proof of knowledge on c,CO , and NymUV using the known public values. If the proof verifies successfully, output 1, otherwise output 0.
Extensions:
k-show Credentials: In the system of https://eprint.iacr.org/2006/454.pdf, authority issues a credential on a user’s secret seed s. To show a credential for the ith time in validity period t,
The user generates a serial number S using a verifiable random function (VRF) as S=fs(0∣∣t∣∣i) along with NIZKP for the correctness of S.
Application to the above construction: The user simply generates a random seed sand includes this value in the commitment to be included in the transaction ledger. For k−show, the user provably evaluates the VRF on the seed s plus a secret counter i.
How does this extension reveal the user’s identity in the event of (k+1)-show of the credential? (The intuition taken from the paper https://eprint.iacr.org/2006/454.pdf is as follows)
In ith−show in time period t, the user releases serial number S=fs(0,t,i), a double-show tag E=pkU⋅fs(1,t,i)R (for a random R supplied by the verifier).
If a user shows k+1 e-tokens during the same time interval, then two of the e-tokens must use the same S.
The issuer (network nodes) can easily detect the violation and compute pkU from the two double-show tags, E=pkU⋅fs(1,t,i)R and E′=pkU⋅fs(1,t,i)R′.
since, from the above two fs(1,t,i)=(E/E′)(R−R′)1 and pkU=E/fs(1,t,i)
Credentials with Hidden Attributes: The user might wish to conceal the attributes requested or shown, instead he proves statements about them, e.g. proving the knowledge of a private key or proving the attribute is within a certain range.
This can be achieved in two ways
Use of multi-message commitments where each message is an attribute. This increases the size of the zero-knowledge proofs (linearly with the number of messages)
To encode the attributes in one single value and then prove statements about that committed value rather than reveal it. For example, given a bit for a particular attribute is set to one, use the first x bits of attribute one, use the next x bits of attribute two, etc., and use range proofs for attributes.
Stateful Credentials: A stateful anonymous credential system is a variant of an anonymous credential system where credential attributes encode some state that can be updated by issuing new credentials.
For example, an operator can update its validator performance credential based on the latest state of attributes (missed_attestation and missed_blocks, etc.).
This credential issuance is typically conditioned on the user showing a previous credential and offering proof that the new credential should be updated as a function of the original.
Update(params,sk,c,skc,CO,update_relation,state′)→(c′,skc′,πu): Given the previous credential information and new state state′=(s0′,s1′,…,sm′)∈Zqm, and an update relation update_relation, generate a fresh random serial number S′∈Zq, and random value r′∈Zq, compute the following and construct the proof πu
UpdateVerify(params,c,CO,πu)→{0,1}: Given a stateful credential c, a credential set CO, and proof πu, output 1 if πu is correct, the proved state transition is a legal one, and the serial number S was not previously used. Otherwise 0.
Integrating with Proof-of-work Bulletin Boards
Integration:
Namecoin provides a built-in storing of key-value pairs and scans the list of the existing list of names. Thus, we can scan credentials, validate and then accumulate them.
For Alice to obtain a credential, she:
Purchase some name from the namespace by registering a public key
1665a…OP_2D
OP_DUPOP_HASH1606c1abe34
OP_EQUALVERIFYOP_CHECKSIG
Prepares a fresh credential with some attributes (attrs) and any supporting documentation necessary for her identity claim (aux) and stores the private portion of the credential (sk,r,r′).
Updates, using the public key from step 1, her registered name to contain a credential and its supporting documentation.
2642f7…7b…
OP_2DROPOP_2DROP
OP_DUPOP_HASH160
14d…OP_EQUALVERIFYOP_CHECKSIG
To show the credential to Bob, Alice:
Scans the list of added names and retrieves all candidate credentials
Checks the supporting documentation for each candidate and puts valid ones in C.
Runs show and sends the result to Bob.
Bob does steps 1 and 2 and computes C.
Bob runs ShowVerify on Alice’s supplied credential and C to verify it
Supporting documentation and verification:
registration fee, no verification is necessary.
Digital signature to be verified.
Some assertion about resource management, e.g. proof of storage/proof of retrievability to be verified in the case of TPM (Trusted Platform Module).
Authentication proofs for accessing off-chain data from Oracles.
Operating cost:
Fee for purchasing the names (<0.01 USD as on 7/31/2013).
A small fee for posting data on the blockchain (e.g., double spend tags and serial numbers in k-show credentials).
Latency:
Depends on the block creation rate and the number of confirmations of the Blockchain network.
Applications
Mitigating Sybil attacks in ad hoc networks: One common approach is to require that clients solve proof-of-work (resource-consuming challenges) that typically involve either storage or computation. This allows clients to re-use the single proof-of-work in an anonymous fashion. One solution to this problem is to use k−show anonymous credentials. This allows the peer to obtain a credential that can be used a limited number of times or a limited number of times within a given time period. When a peer exceeds the k-show threshold (e.g., by cloning the credential for a Sybil attack), the credential can be identified and revoked. The paper https://ieeexplore.ieee.org/document/1698607 describes computational puzzles as Sybil defenses.
Performance:
There are four underlying operations:
Minting a credential
Verifying that the mint is correct
Showing a credential
Verifying that show.
Showing and verifying credentials also entails computing the accumulation of all or all but one of the current credentials. For each new credential added, the user updates both the accumulator and witness for which it intends to show the credential.
The experiments we measured in seconds and were repeated for 500 iterations.
The complexity of the proof of knowledge generated during the credential show is reduced by parallelizing the independent computations.