Recently I came across this proof for fact that primes are infinite.

It's a proof by contradiction. The proof assumes that primes are finite and there is a prime M which is larger than any prime out there. Then you basically take the product of all primes up to and including M and you add one to it, which the source where I read this proof claims is a prime obviously larger than M hence a contradiction to our assumption that primes are finite.

So why is it that product of first N primes + 1 another prime? 


Question: Implement signature-level security on Android services with more than one allowed signature
Answer: Great info jelford, but I would suggest instead of storing the entire string of the signature, to store/compare the SHA-1 of the certificate as shown in this answer from matreshkin.

This is similar to how Google handles the Maps Android API, and this will match the output shown via keytool.

private boolean checkAuthorized() throws SecurityException {
    PackageManager pm = getPackageManager();
    try {
        PackageInfo packageInfo = pm.getPackageInfo(pm.getNameForUid(getCallingUid()),
            PackageManager.GET_SIGNATURES);
        Signature[] signatures = packageInfo.signatures;
        byte[] certBytes = signatures[0].toByteArray();
        CertificateFactory cf = CertificateFactory.getInstance("X509");
        X509Certificate cert = (X509Certificate)cf.generateCertificate(
            new ByteArrayInputStream(certBytes));
        MessageDigest md = MessageDigest.getInstance("SHA1");
        byte[] encodedCert = md.digest(cert.getEncoded());
        String hexString = byte2HexFormatted(encodedCert);

        Log.d("public certificate SHA-1: " + hexString);

        String trustedAppName = trustedCerts.get(hexString);
        if (trustedAppName != null) {
            Log.d("Found public certificate SHA-1 for " + trustedAppName);
            return true;
        }
    } catch (Exception e) {
        Log.e(e, "Unable to get certificate from client");
    }

    Log.w("Couldn't find signature in list of trusted certs!");
    /* Crash the calling application if it doesn't catch */
    throw new SecurityException();
}

public static String byte2HexFormatted(byte[] arr) {
    StringBuilder str = new StringBuilder(arr.length * 2);
    for (int i = 0; i &lt; arr.length; i++) {
        String h = Integer.toHexString(arr[i]);
        int l = h.length();
        if (l == 1) h = "0" + h;
        if (l &gt; 2) h = h.substring(l - 2, l);
        str.append(h.toUpperCase());
        if (i &lt; (arr.length - 1)) str.append(':');
    }
    return str.toString();
}