Crypto-View

factionsecurity/faction

Readiness score
67 of 100
How this is calculated · previous scan 67
Cryptographic posture
Quantum-vulnerable 6 Already broken 3 Reduced margin 25 Could not be determined 10 Quantum-safe 3
To address27
Key establishment2
Inventory only1
Total findings48
What was analysed
Branch main
Commit e5536dc7ec216c3191f1bf1fe4551ce8a77a63f5 Update README with Faction 2.0 release information
Committed 2026-09-06 06:52 UTC
Scanned 2026-09-10 21:50 UTC 5 hours ago
Coverage 614 files, 266 java, 286 javascript

Earlier scans of this repository

10 scans · score 72 → 67 · compare any two
10 scans · 72 → 67 (down 5). The filled point is the scan you are reading.
Scanned Commit Score To address
4 hours ago e5536dc7ec21 main 67 27 Compare
5 hours ago this scan e5536dc7ec21 main 67 27
21 hours ago e5536dc7ec21 main 67 27 Compare
1 day ago e5536dc7ec21 main 67 27 Compare
1 day ago e5536dc7ec21 main 67 27 Compare
1 day ago e5536dc7ec21 main 67 27 Compare
1 day ago e5536dc7ec21 main 72 19 Compare
3 days ago e5536dc7ec21 main 72 19 Compare
3 days ago e5536dc7ec21 main 72 19 Compare
8 days ago 4dc6723a0ec3 main 72 19 Compare

Every repository in this history is re-scanned weekly.

List of cryptographic assets

MD5 Already broken 3 places See details

Hash algorithm through the JCA

`MessageDigest.getInstance()`. MD5 and SHA-1 are reported as already broken; SHA-256 is reported as a reduced margin rather than a defect.

This is already unsafe today, with no quantum computer involved. Practical chosen-prefix collisions exist; MD5 has no remaining security as a digest.

What to do. SHA-256 as the floor, SHA-384 where the digest protects something that must remain verifiable for decades.

  1. src/com/fuse/utils/FSUtils.java:510 md = MessageDigest.getInstance("md5");
  2. src/com/fuse/utils/FSUtils.java:521 md = MessageDigest.getInstance("md5");
  3. src/com/fuse/utils/ReportImageScaler.java:210 MessageDigest md = MessageDigest.getInstance("MD5");
java.messagedigest · CWE-328
RSA2048-bit Quantum-vulnerable Recorded traffic 1 place See details

Classical key pair generated through the JCA

`KeyPairGenerator.getInstance()` with a classical algorithm. The concrete family and, where an `initialize()` call is close enough to read, the key size are resolved from the source and reported on the finding.

A quantum computer of sufficient size breaks this completely. It has to be replaced, not tuned. Broken by Shor's algorithm on a cryptographically relevant quantum computer.

What to do. Generate the classical key alongside an ML-KEM or ML-DSA key and carry both until relying parties accept the post-quantum one.

  1. src/com/fuse/dao/SystemSettings.java:785 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
java.keypairgenerator · CWE-327
TLS Quantum-vulnerable Recorded traffic 1 place See details

TLS context created in code

`SSLContext.getInstance()`. The protocol version is reported; the key exchange it negotiates is classical in every TLS 1.2 and 1.3 cipher suite available today.

A quantum computer of sufficient size breaks this completely. It has to be replaced, not tuned. Every TLS cipher suite in general use negotiates a classical key exchange, so a recorded session is decryptable once that exchange falls.

What to do. Keep TLS 1.3, and track the hybrid key-exchange groups as they reach the JDK. TLS is where harvest-now-decrypt-later exposure is largest.

java.sslcontext · CWE-757
SHA-256 Reduced margin 5 places See details

Hash algorithm through the JCA

`MessageDigest.getInstance()`. MD5 and SHA-1 are reported as already broken; SHA-256 is reported as a reduced margin rather than a defect.

A quantum computer weakens this but does not break it. Increasing the key or digest size restores the margin. Pre-image resistance falls to about 128 bits of quantum work. Adequate for most uses; SHA-384 restores the full margin where a signature must last decades.

What to do. SHA-256 as the floor, SHA-384 where the digest protects something that must remain verifiable for decades.

  1. src/com/fuse/reporting/DocxPrecompiler.java:627 MessageDigest md = MessageDigest.getInstance("SHA-256");
  2. src/com/fuse/utils/FSUtils.java:461 MessageDigest md = MessageDigest.getInstance("SHA-256");
  3. src/com/fuse/utils/FSUtils.java:484 MessageDigest md = MessageDigest.getInstance("SHA-256");
  4. src/com/fuse/utils/FSUtils.java:533 MessageDigest md = MessageDigest.getInstance("SHA-256");
  5. src/com/fuse/utils/FSUtils.java:561 MessageDigest md = MessageDigest.getInstance("SHA-256");
java.messagedigest · CWE-328
AES Reduced margin 4 places See details

Key material constructed for a named algorithm

`new SecretKeySpec(bytes, "AES")` and the other key-spec constructors name the algorithm as an argument rather than through `getInstance()`. Code that wraps raw bytes into a key this way often never calls `getInstance()` at all, so the algorithm is invisible to a scan that only looks at the factories.

This wraps raw bytes into a key for a named algorithm. It is part of the same migration as whatever uses that key.

What to do. Wherever this key is used, the same migration applies as to the call that consumes it. Trace it to the operation and treat the two together.

  1. src/com/fuse/utils/FSUtils.java:469 SecretKey SecKey = new SecretKeySpec(tmp.getEncoded(), "AES");
  2. src/com/fuse/utils/FSUtils.java:492 SecretKey SecKey = new SecretKeySpec(tmp.getEncoded(), "AES");
  3. src/com/fuse/utils/FSUtils.java:541 SecretKey SecKey = new SecretKeySpec(tmp.getEncoded(), "AES");
  4. src/com/fuse/utils/FSUtils.java:569 SecretKey SecKey = new SecretKeySpec(tmp.getEncoded(), "AES");
java.keyspec · CWE-327
AES Reduced margin 4 places See details

Classical public-key cipher through the JCA

`Cipher.getInstance()` with a transformation whose algorithm component is a public-key or legacy symmetric cipher. The transformation string is parsed into algorithm, mode and padding, so `RSA/ECB/PKCS1Padding` is separated from `RSA/ECB/OAEPWithSHA-256AndMGF1Padding`.

A quantum computer weakens this but does not break it. Increasing the key or digest size restores the margin. Grover's algorithm halves the effective strength; the parameter, not the design, is the problem. The key size was not visible at this call site, so the weaker case is assumed.

What to do. For RSA encryption, move to ML-KEM-768 and keep RSA-OAEP only as the classical half of a hybrid during transition.

  1. src/com/fuse/utils/FSUtils.java:471 Cipher AesCipher = Cipher.getInstance("AES");
  2. src/com/fuse/utils/FSUtils.java:494 Cipher AesCipher = Cipher.getInstance("AES");
  3. src/com/fuse/utils/FSUtils.java:543 Cipher AesCipher = Cipher.getInstance("AES");
  4. src/com/fuse/utils/FSUtils.java:571 Cipher AesCipher = Cipher.getInstance("AES");
java.cipher · CWE-327
PBKDF2 Reduced margin 4 places See details

Key material constructed for a named algorithm

`new SecretKeySpec(bytes, "AES")` and the other key-spec constructors name the algorithm as an argument rather than through `getInstance()`. Code that wraps raw bytes into a key this way often never calls `getInstance()` at all, so the algorithm is invisible to a scan that only looks at the factories.

This wraps raw bytes into a key for a named algorithm. It is part of the same migration as whatever uses that key.

What to do. Wherever this key is used, the same migration applies as to the call that consumes it. Trace it to the operation and treat the two together.

  1. src/com/fuse/utils/FSUtils.java:467 KeySpec spec = new PBEKeySpec(b64hash, "f04ce910-bedb-4d8f-a023-4d2441dc0fba".getBytes(), 65536, 256);
  2. src/com/fuse/utils/FSUtils.java:490 KeySpec spec = new PBEKeySpec(b64hash, "f04ce910-bedb-4d8f-a023-4d2441dc0fba".getBytes(), 65536, 256);
  3. src/com/fuse/utils/FSUtils.java:539 KeySpec spec = new PBEKeySpec(b64hash, "f04ce910-bedb-4d8f-a023-4d2441dc0fba".getBytes(), 65536, 256);
  4. src/com/fuse/utils/FSUtils.java:567 KeySpec spec = new PBEKeySpec(b64hash, "f04ce910-bedb-4d8f-a023-4d2441dc0fba".getBytes(), 65536, 256);
java.keyspec · CWE-327
SHA-256 Reduced margin 4 places See details

Classical public-key cipher through the JCA

`Cipher.getInstance()` with a transformation whose algorithm component is a public-key or legacy symmetric cipher. The transformation string is parsed into algorithm, mode and padding, so `RSA/ECB/PKCS1Padding` is separated from `RSA/ECB/OAEPWithSHA-256AndMGF1Padding`.

A quantum computer weakens this but does not break it. Increasing the key or digest size restores the margin. Pre-image resistance falls to about 128 bits of quantum work. Adequate for most uses; SHA-384 restores the full margin where a signature must last decades.

What to do. For RSA encryption, move to ML-KEM-768 and keep RSA-OAEP only as the classical half of a hybrid during transition.

  1. src/com/fuse/utils/FSUtils.java:466 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
  2. src/com/fuse/utils/FSUtils.java:489 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
  3. src/com/fuse/utils/FSUtils.java:538 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
  4. src/com/fuse/utils/FSUtils.java:566 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
java.cipher · CWE-327
PBKDF2 Reduced margin 4 places See details

Password hashing or key derivation

A `SecretKeyFactory` for PBKDF2, or a BouncyCastle password KDF. Not a quantum exposure, and part of a complete inventory.

This is how passwords are stored. Quantum computers do not meaningfully weaken it.

What to do. PBKDF2 needs a high iteration count. Argon2 through BouncyCastle is stronger.

  1. src/com/fuse/utils/FSUtils.java:466 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
  2. src/com/fuse/utils/FSUtils.java:489 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
  3. src/com/fuse/utils/FSUtils.java:538 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
  4. src/com/fuse/utils/FSUtils.java:566 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
java.kdf
unknown Could not be determined 1 place See details

Key store holding classical key material

`KeyStore.getInstance("JKS"|"PKCS12"|"BCFKS")`. The store format itself is not the issue; it is the inventory point where the classical private keys of this application live.

This is the application's key cupboard. It is worth knowing what is in it before planning any replacement.

What to do. Record which keys this store holds. A key store is where a migration either happens or silently does not.

  1. src/com/fuse/dao/SystemSettings.java:792 KeyStore keyStore = KeyStore.getInstance("JKS");
java.keystore
CSPRNG Quantum-safe 3 places See details

Random number generation

`SecureRandom`. A platform CSPRNG is not a quantum exposure; it is recorded because an inventory that omits the randomness source is incomplete. `SHA1PRNG` is named explicitly where it appears, since it is a legacy algorithm even though its output is adequate.

This is where the software gets its random numbers. Quantum computers do not weaken it.

What to do. No action. Prefer the platform default over naming an algorithm.

  1. src/com/fuse/authentication/InsecureSSLSocketFactory.java:27 ctx.init(null,new TrustManager[] { new DummyTrustmanager() }, new SecureRandom());
  2. src/com/fuse/dao/SystemSettings.java:786 keyPairGen.initialize(2048, new SecureRandom());
  3. src/com/fuse/utils/FSUtils.java:84 private static final SecureRandom SECURE_RANDOM = new SecureRandom();
java.rng

Cryptographic assets

Algorithm Assessment What it means Occurrences
unknown Could not be determined The algorithm could not be established from the source - chosen at runtime, or decided somewhere this scan does not reach. 10
SHA-256 Reduced margin Pre-image resistance falls to about 128 bits of quantum work. Adequate for most uses; SHA-384 restores the full margin where a signature must last decades. 9
AES Reduced margin Grover's algorithm halves the effective strength; the parameter, not the design, is the problem. The key size was not visible at this call site, so the weaker case is assumed. 8
PBKDF2 Reduced margin Not broken by a quantum computer, but weak against modern GPU cracking at low iteration counts, which is a present-day concern. 8
TLS Quantum-vulnerable Every TLS cipher suite in general use negotiates a classical key exchange, so a recorded session is decryptable once that exchange falls. 4
MD5 Already broken Practical chosen-prefix collisions exist; MD5 has no remaining security as a digest. 3
CSPRNG Quantum-safe A cryptographically secure random number generator provided by the platform. Not weakened by a quantum computer. 3
RSA Quantum-vulnerable Broken by Shor's algorithm on a cryptographically relevant quantum computer. 2

Imported cryptographic libraries

Library Files
javax.net.ssl the TLS client and server 3
org.bouncycastle BouncyCastle, whose low-level API bypasses the JCA algorithm strings. It has shipped ML-KEM and ML-DSA since 1.79 1
java.security the JCA 8