标签: java-security

模块边界也是安全边界吗?

我想知道模块边界是否也是安全边界?

更具体地说,没有非法访问(--illegal-access=deny)和拒绝访问jdk.unsupported,它看起来accessClassInPackage不会再导致完整的沙箱逃脱.

真的吗?当此权限授予不受信任的代码时,是否还有其他方法可以破坏JVM的安全性?

要明确:

  • 要加载您需要的本机库ReflectPermission("supressAccessChecks")- 未授予
  • 要访问ReflectPermission("supressAccessChecks")您需要访问-Djava.security.manager模块和--illegal-access=deny- 未授予
  • RuntimePermission("loadLibrary.*")通过反射访问sun.misc.Unsafe,RuntimePermission("accessClassInPackage.sun.misc")必须打开ClassLoader.defineClass您的模块 - 它不是.

所以要么:

  • 是否有其他方法可以绕过/转义java沙箱setAccessible(true)
  • 或者模块边界是否被视为安全边界,这样的沙箱旁路会被视为安全漏洞?

java security sandbox java-security java-module

7
推荐指数
0
解决办法
223
查看次数

我可以为JWS应用程序更改disabledAlgorithms吗?

可能重复:JNLP中的java.security.properties

我们有一个桌面应用程序,我们开始使用Java WebStart.从JDK 1.8.71开始,MD5现已禁用以进行X509证书验证.遗憾的是,我们无法更改我们正在使用的证书.

解决方法是更改​​java.security文件(jre/lib/security/java.security),使得"jdk.certpath.disabledAlgorithms"不再包含MD5,但由于我们无权访问,因此这绝对是不可能的.客户电脑.我们尝试在JNLP文件中设置属性(不起作用)并调用:

java.security.Security.setProperty("jdk.certpath.disabledAlgorithms", "");
java.security.Security.setProperty("jdk.tls.disabledAlgorithms", "");
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于本地启动的JAR,但不适用于JNLP.知道这应该有用吗?我找不到任何关于JNLP可以编辑哪些安全属性的文档.

java jnlp java-web-start java-security

6
推荐指数
0
解决办法
640
查看次数

从 PKCS8 编码数据创建任何 PrivateKey 实例(RSA 或 DSA 或 EC)

我有一个代表私钥的未加密 PKCS8 编码文件。它可以是这些私钥类型中的任何一种 - RSA、DSA 或 EC。我在 ASN1 解码器 ( https://lapo.it/asn1js/ ) 中查看了这些文件,我可以看到数据中的类型(RSA、DSA 或 EC)。

有没有办法将 PKC8 私钥数据读入正确的私钥 Java 对象,而无需在这样的代码中指定密钥类型 -

PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(pkcs8key);
KeyFactory factory = KeyFactory.getInstance("RSA"); // Avoid "RSA" here?
PrivateKey privateKey = factory.generatePrivate(spec);
Run Code Online (Sandbox Code Playgroud)

有没有办法避免在 中指定算法KeyFactory.getInstance("RSA")?这不应该由 确定,PKCS8EncodedKeySpec因为它在 PKCS8 数据中可用?

示例未加密的 PKCS8 数据及其显示密钥类型的 ASN1 解码 -

动态搜索广告 -链接

EC -链接

RSA -链接

java rsa pkcs#8 ecdsa java-security

6
推荐指数
1
解决办法
971
查看次数

没有这样的算法:供应商 SunPKCS11 的 PKCS11-CartaoCidadao

我目前的提供商有:

0 - 提供商名称:SUN 1 - 提供商名称:SunRsaSign 2 - 提供商名称:SunEC

...

9 - 提供商名称:SunPKCS11-CartaoCidadao

第九个提供程序是我尝试使用的提供程序,它使用 pkcs11 库。

Provider prov = Security.getProvider("SunPKCS11-CartaoCidadao");
keyStore = KeyStore.getInstance("PKCS11", prov );
Run Code Online (Sandbox Code Playgroud)

使用 info 方法我可以看到它正在使用该库:

System.out.println(prov.getInfo());
Run Code Online (Sandbox Code Playgroud)

SunPKCS11-CartaoCidadao 使用库 /usr/local/lib/libpteidpkcs11.so

然而,当我尝试获取密钥实例时,它告诉我该提供程序没有 PKCS11,而它应该是这样。

KeyStore ks = KeyStore.getInstance("PKCS11","SunPKCS11-CartaoCidadao");
keyStore.load( null, null );
Run Code Online (Sandbox Code Playgroud)

java.security.KeyStoreException:未找到 PKCS11

引起原因:java.security.NoSuchAlgorithmException:没有这样的算法:提供商 SunPKCS11-CartaoCidadao 的 PKCS11

有人知道如何解决这个问题吗?

java keystore pkcs#11 java-security sunpkcs11

6
推荐指数
1
解决办法
3897
查看次数

ES256 JWT 验证 - SignatureException:签名编码无效:java.io.IOException:序列标记错误

嗨,我有一个使用 Elliptic Curve ES256 签名的 JWT,我正在尝试验证它:

eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ.eyJpc3MiOiJodHRwczovL2p3dC1pZHAuZXhhbXBsZS5jb20iLCJzdWIiOiJtYWlsdG86bWlrZUBleGFtcGxlLmNvbSIsIm5iZiI6MTU3NTY1NjY3NCwiZXhwIjoxOTI0OTkxOTk5LCJpYXQiOjE1NzU2NTY2NzQsImp0aSI6ImlkMTIzNDU2IiwidHlwIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9yZWdpc3RlciJ9.kcj0QQrERKIfny1TfHY-Z9iDFazr84xCssTDuXtV1n1dvY7CYXuP5ZBvpi9ArOQjsS8YCd0bKsWaQ-17VnF_1A
Run Code Online (Sandbox Code Playgroud)

使用此公钥:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoBUyo8CQAFPeYPvv78ylh5MwFZjT
CLQeb042TjiMJxG+9DLFmRSMlBQ9T/RsLLc+PmpB1+7yPAR+oR5gZn3kJQ==
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

这只是

eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMzQifQ.eyJpc3MiOiJodHRwczovL2p3dC1pZHAuZXhhbXBsZS5jb20iLCJzdWIiOiJtYWlsdG86bWlrZUBleGFtcGxlLmNvbSIsIm5iZiI6MTU3NTY1NjY3NCwiZXhwIjoxOTI0OTkxOTk5LCJpYXQiOjE1NzU2NTY2NzQsImp0aSI6ImlkMTIzNDU2IiwidHlwIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9yZWdpc3RlciJ9.kcj0QQrERKIfny1TfHY-Z9iDFazr84xCssTDuXtV1n1dvY7CYXuP5ZBvpi9ArOQjsS8YCd0bKsWaQ-17VnF_1A
Run Code Online (Sandbox Code Playgroud)

它在https://jwt.io/ 上正确验证但是当我尝试使用本机 Java 验证它时,它引发了一个错误:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoBUyo8CQAFPeYPvv78ylh5MwFZjT
CLQeb042TjiMJxG+9DLFmRSMlBQ9T/RsLLc+PmpB1+7yPAR+oR5gZn3kJQ==
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

{
  "kty": "EC",
  "use": "sig",
  "crv": "P-256",
  "kid": "1234",
  "x": "oBUyo8CQAFPeYPvv78ylh5MwFZjTCLQeb042TjiMJxE=",
  "y": "vvQyxZkUjJQUPU/0bCy3Pj5qQdfu8jwEfqEeYGZ95CU=",
  "alg": "ES256"
}
Run Code Online (Sandbox Code Playgroud)

最后一行似乎引发了异常。


java.security.SignatureException: invalid encoding for signature: java.io.IOException: Sequence tag error
    at com.ibm.crypto.provider.AbstractSHAwithECDSA.engineVerify(Unknown Source)
    at java.security.Signature$Delegate.engineVerify(Signature.java:1219)
    at java.security.Signature.verify(Signature.java:652)
    at curam.platforminfrastructure.outbound.oauth2.impl.ValidateJWT.validateEllipticCurve(ValidateJWT.java:235)
    at curam.platforminfrastructure.outbound.oauth2.impl.ValidateJWT.validateJWT(ValidateJWT.java:88)
    at curam.platforminfrastructure.outbound.oauth2.impl.ValidateJWT.testJWT(ValidateJWT.java:53)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at …
Run Code Online (Sandbox Code Playgroud)

java cryptography elliptic-curve java-security jwt-auth

6
推荐指数
1
解决办法
1434
查看次数

BCrypt vs Argon2 及其哈希算法

我在一家提供软件服务的初创公司工作,最近我们制定了加密安全标准。对于散列,设定的标准是我们应该使用 SHA-512 或 SHA-256。

对于Java,我们正在考虑使用Spring的Bcrypt或Argon2。实际上阅读他们的文档,如果他们的底层算法使用 SHA-512 或 SHA-256 或其他东西,找不到任何信息?

或者这些都是过时的哈希算法,我们应该使用其他算法吗?

谁可以帮我这个事?

hash spring-security bcrypt java-security argon2-ffi

6
推荐指数
1
解决办法
2万
查看次数

实现DH协议时出现java.security.InvalidKeyException

在我的 Android 应用程序中,我想实现 Diffie-Hellman 协议,以便在两个用户之间生成公共秘密。

我所做的如下:当第一个用户向第二个用户发送友谊请求时,应用程序会生成一个密钥对,将公共密钥存储在远程数据库中,将私有密钥存储在本地数据库中。

这是第一部分的代码:

generateKeys();
localDB.insertPrivateKey(userId, entityId, privateKey);
remoteDB.insertFirstPublicKey(userId, entityId, publicKey);
Run Code Online (Sandbox Code Playgroud)

生成密钥方法如下:

private void generateKeys() {
        try {
            final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DH");
            keyPairGenerator.initialize(1024);

            final KeyPair keyPair = keyPairGenerator.generateKeyPair();

            privateKey = keyPair.getPrivate();
            publicKey  = keyPair.getPublic();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

当第二个用户接受请求时,会生成另一个密钥对,再次将私钥存储在本地数据库中,将公钥存储在远程数据库中。然后它从远程数据库获取第一个用户的公钥,将其转换回 PublicKey 并生成公共密钥。

这是第二部分的代码:

generateKeys();
localDB.insertPrivateKey(userId, entityId, privateKey);
remoteDB.insertSecondPublicKey(entityId, userId, publicKey);
String stringFirstPubKey = remoteDB.fetchFirstKey(entityId, userId);
PublicKey firstPubKey = stringToPublicKey(stringFirstPubKey);
byte[] commonSecret = generateCommonSecret(firstPubKey);
Run Code Online (Sandbox Code Playgroud)

stringToPublicKey 如下:

private PublicKey stringToPublicKey(String stringPubK) throws NoSuchAlgorithmException, InvalidKeySpecException { …
Run Code Online (Sandbox Code Playgroud)

java android cryptography diffie-hellman java-security

5
推荐指数
0
解决办法
375
查看次数

java 应用程序中主机的前向和后向 DNS 条目如何匹配,使其免受 DNS 欺骗

我正在使用 fortify,它显示了攻击者可以在我尝试在 java 应用程序中获取主机名时进行 DNS 欺骗的漏洞。我有一个解决方案,通过匹配正向 DNS 和反向 DNS 条目可以避免这种情况。但它有什么用处以及如何实现它,我无法找到它。Fortify 在这一行显示出漏洞

线路链接

Fortify 显示的建议如下:

建议:

如果您进行检查以确保主机的前向和后向 DNS 条目匹配,则可以增加域名查找的信心。如果不控制目标域的名称服务器,攻击者将无法欺骗正向和反向 DNS 条目。然而,这并不是一个万无一失的方法:攻击者可能能够说服域名注册商将域名移交给恶意域名服务器。基于 DNS 条目进行身份验证是一个冒险的提议。

感谢任何帮助,也欢迎其他解决方案。

提前致谢。

dns fortify java-security

5
推荐指数
1
解决办法
3798
查看次数

使用 keytool 找不到 SunPKCS11 提供程序

我正在使用 java 9 运行以下命令:

keytool -keystore NONE -storetype PKCS11 -providerClass
     sun.security.pkcs11.SunPKCS11 -providerArg pkcs11conf -list
Run Code Online (Sandbox Code Playgroud)

并得到流动的错误:

keytool 错误:java.lang.Exception:未找到提供程序“sun.security.pkcs11.SunPKCS11”

在 Java 8 中它可以工作。

如何将 keytool 与 SunPKCS11 提供程序一起使用?

java keytool pkcs#11 java-9 java-security

5
推荐指数
1
解决办法
6803
查看次数

仅使用 openssl 创建了 java truststore.p12

我在安装过程中生成自签名证书,并且不想安装 JDK 来获取 keytool(这无疑会使 问题变得更容易)。

根据之前的讨论,PKCS12 信任库包必须具有必需的属性“2.16.840.1.113894.746875.1.1”,以便 JRE 将其用作可接受的信任库。

本文介绍向证书请求添加 OID。该方法看起来很有希望,但我不断收到以下错误

Error Loading request extension section req_ext
...:X509 V3 routines:do_ext_nconf:unknown extension:../crypto/x509v3/v3_conf.c:82:
...:X509 V3 routines:X509V3_EXT_nconf:error in extension:../crypto/x509v3/v3_conf.c:47:name=java_trusted_ca, value=yes
.
.
where relevant parts of openssl.conf are:
oid_section = OIDs
[ OIDs ]
java_trusted_ca = 2.16.840.1.113894.746875.1.1
[ req ]
req_extensions = req_ext
[ req_ext ]
java_trusted_ca=yes
Run Code Online (Sandbox Code Playgroud)

我需要帮助设置属性,以便属性包含:

MAC Iteration 1024
MAC verified OK
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 1024
Certificate bag
Bag Attributes
    friendlyName: microsoft it ssl sha2 …
Run Code Online (Sandbox Code Playgroud)

java openssl java-security

5
推荐指数
0
解决办法
1419
查看次数