A method, comprising: receiving, by a processor, a plurality of artifact fingerprints generated from a plurality of artifacts, wherein the plurality of artifact fingerprints are generated by generating shingles from text within each of the plurality of artifacts; and cryptographically hashing the shingles to generate a plurality of artifact fingerprints; storing the artifact fingerprints in a database; receiving, by the processor, at least one query fingerprint from a querying entity; determining, by the processor, whether the received at least one query fingerprint matches any of the artifact fingerprints stored in the database; and outputting an indication of an entity that provided an artifact containing a matched fingerprint to the querying entity without revealing plaintext of the artifact containing the matched fingerprint, wherein the plurality of artifact fingerprints are received from a plurality of different entities, wherein the at least one query fingerprint is generated by: receiving a plaintext query; generating a plurality of query shingles from the plaintext query so that character overlap between adjacent shingles is greater than a character overlap between adjacent shingles of the plurality of artifact fingerprints; cryptographically hashing the plurality of query shingles to form a plurality of query fingerprints. receiving, by a processor, a plurality of artifact fingerprints generated from a plurality of artifacts, wherein the plurality of artifact fingerprints are generated by generating shingles from text within each of the plurality of artifacts; and cryptographically hashing the shingles to generate a plurality of artifact fingerprints; generating shingles from text within each of the plurality of artifacts; and cryptographically hashing the shingles to generate a plurality of artifact fingerprints; storing the artifact fingerprints in a database; receiving, by the processor, at least one query fingerprint from a querying entity; determining, by the processor, whether the received at least one query fingerprint matches any of the artifact fingerprints stored in the database; and outputting an indication of an entity that provided an artifact containing a matched fingerprint to the querying entity without revealing plaintext of the artifact containing the matched fingerprint, wherein the plurality of artifact fingerprints are received from a plurality of different entities, wherein the at least one query fingerprint is generated by: receiving a plaintext query; generating a plurality of query shingles from the plaintext query so that character overlap between adjacent shingles is greater than a character overlap between adjacent shingles of the plurality of artifact fingerprints; cryptographically hashing the plurality of query shingles to form a plurality of query fingerprints. receiving a plaintext query; generating a plurality of query shingles from the plaintext query so that character overlap between adjacent shingles is greater than a character overlap between adjacent shingles of the plurality of artifact fingerprints; cryptographically hashing the plurality of query shingles to form a plurality of query fingerprints.