我想知道模块边界是否也是安全边界?
更具体地说,没有非法访问(--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您的模块 - 它不是.所以要么:
setAccessible(true)?可能重复: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可以编辑哪些安全属性的文档.
我有一个代表私钥的未加密 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 -链接
我目前的提供商有:
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
有人知道如何解决这个问题吗?
嗨,我有一个使用 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) 我在一家提供软件服务的初创公司工作,最近我们制定了加密安全标准。对于散列,设定的标准是我们应该使用 SHA-512 或 SHA-256。
对于Java,我们正在考虑使用Spring的Bcrypt或Argon2。实际上阅读他们的文档,如果他们的底层算法使用 SHA-512 或 SHA-256 或其他东西,找不到任何信息?
或者这些都是过时的哈希算法,我们应该使用其他算法吗?
谁可以帮我这个事?
在我的 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) 我正在使用 fortify,它显示了攻击者可以在我尝试在 java 应用程序中获取主机名时进行 DNS 欺骗的漏洞。我有一个解决方案,通过匹配正向 DNS 和反向 DNS 条目可以避免这种情况。但它有什么用处以及如何实现它,我无法找到它。Fortify 在这一行显示出漏洞
Fortify 显示的建议如下:
建议:
如果您进行检查以确保主机的前向和后向 DNS 条目匹配,则可以增加域名查找的信心。如果不控制目标域的名称服务器,攻击者将无法欺骗正向和反向 DNS 条目。然而,这并不是一个万无一失的方法:攻击者可能能够说服域名注册商将域名移交给恶意域名服务器。基于 DNS 条目进行身份验证是一个冒险的提议。
感谢任何帮助,也欢迎其他解决方案。
提前致谢。
我正在使用 java 9 运行以下命令:
Run Code Online (Sandbox Code Playgroud)keytool -keystore NONE -storetype PKCS11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg pkcs11conf -list
并得到流动的错误:
keytool 错误:java.lang.Exception:未找到提供程序“sun.security.pkcs11.SunPKCS11”
在 Java 8 中它可以工作。
如何将 keytool 与 SunPKCS11 提供程序一起使用?
我在安装过程中生成自签名证书,并且不想安装 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)