- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我目前正在研究一种将键转换为字符串的方法,反之亦然。它适用于公钥转换,并将私钥转换为字符串。出于某种原因,相同的代码不会将字符串转换回私钥,我只是无法弄清楚。
转换器代码为:
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
@SuppressWarnings("restriction")
public class KeyConvert {
public static PublicKey stringToPublicKey(String s) {
BASE64Decoder decoder = new BASE64Decoder();
byte[] c = null;
KeyFactory keyFact = null;
PublicKey returnKey = null;
try {
c = decoder.decodeBuffer(s);
keyFact = KeyFactory.getInstance("DSA", "SUN");
} catch (Exception e) {
System.out.println("Error in Keygen");
e.printStackTrace();
}
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(c);
try {
returnKey = keyFact.generatePublic(x509KeySpec);
} catch (Exception e) {
System.out.println("Error in Keygen2");
e.printStackTrace();
}
return returnKey;
}
public static PrivateKey stringToPrivateKey(String s) {
BASE64Decoder decoder = new BASE64Decoder();
byte[] c = null;
KeyFactory keyFact = null;
PrivateKey returnKey = null;
try {
c = decoder.decodeBuffer(s);
keyFact = KeyFactory.getInstance("DSA", "SUN");
} catch (Exception e) {
System.out.println("Error in first try catch of stringToPrivateKey");
e.printStackTrace();
}
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(c);
try { //the next line causes the crash
returnKey = keyFact.generatePrivate(x509KeySpec);
} catch (Exception e) {
System.out.println("Error in stringToPrivateKey");
e.printStackTrace();
}
return returnKey;
}
public static String publicKeyToString(PublicKey p) {
byte[] publicKeyBytes = p.getEncoded();
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(publicKeyBytes);
}
public static String privateKeyToString(PrivateKey p) {
byte[] privateKeyBytes = p.getEncoded();
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(privateKeyBytes);
}
}
我使用的驱动代码是:
import java.security.PrivateKey;
import java.security.PublicKey;
public class SQLServerTest {
public static void main(String[] args) throws Exception {
ServerSQLManager s = new ServerSQLManager();
ServerUser user = new ServerUser("testUser", "pass123");
s.getKeys(user);
PublicKey testKey = user.getPublicKey();
System.out.println(testKey);
PrivateKey testKey2 = user.getPrivateKey();
System.out.println(testKey2);
}
}
当我运行它时,我得到了一个不合适的 key 规范,谁能指出我正确的方向?控制台输出为:
Error in stringToPrivateKey
java.security.spec.InvalidKeySpecException: Inappropriate key specification
at sun.security.provider.DSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at KeyConvert.stringToPrivateKey(KeyConvert.java:61)
at ServerSQLManager.getKeys(ServerSQLManager.java:128)
at SQLServerTest.main(SQLServerTest.java:20)
Sun DSA Public Key
Parameters:DSA
p: fd7f5381 1d751229 52df4a9c 2eece4e7 f611b752 3cef4400 c31e3f80 b6512669
455d4022 51fb593d 8d58fabf c5f5ba30 f6cb9b55 6cd7813b 801d346f f26660b7
6b9950a5 a49f9fe8 047b1022 c24fbba9 d7feb7c6 1bf83b57 e7c6a8a6 150f04fb
83f6d3c5 1ec30235 54135a16 9132f675 f3ae2b61 d72aeff2 2203199d d14801c7
q: 9760508f 15230bcc b292b982 a2eb840b f0581cf5
g: f7e1a085 d69b3dde cbbcab5c 36b857b9 7994afbb fa3aea82 f9574c0b 3d078267
5159578e bad4594f e6710710 8180b449 167123e8 4c281613 b7cf0932 8cc8a6e1
3c167a8b 547c8d28 e0a3ae1e 2bb3a675 916ea37f 0bfa2135 62f1fb62 7a01243b
cca4f1be a8519089 a883dfe1 5ae59f06 928b665e 807b5525 64014c3b fecf492a
y:
5210e849 24d90208 56802887 dfaededf 78d3e6d0 d2e59a1c fb52dde8 96147784
b2589365 2529414c 8265b61d c1fe6d98 cee0eea3 cce1e366 cd621ca7 41e3a94f
9c15bfcb eb860d19 21efd574 79bb5b15 8159b1cb e3fc7f76 f85a6fc1 8d65afc6
7c4fafda 503b01b5 99752ee4 2408ad80 1d983579 b00e2120 6d735874 ccaea1c0
null
我知道我不应该使用 sun.misc.* 库,我们正在研究 Apache 版本,但仍想弄清楚(而且它永远不会是生产代码)
任何建议表示赞赏。
最佳答案
与您一样,公钥使用 X509EncodedKeySpec 存储,但私钥使用 PKCS8EncodedKeySpec。比如这样:
public static PrivateKey loadPrivateKey(String key64) throws GeneralSecurityException {
byte[] clear = base64Decode(key64);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(clear);
KeyFactory fact = KeyFactory.getInstance("DSA");
PrivateKey priv = fact.generatePrivate(keySpec);
Arrays.fill(clear, (byte) 0);
return priv;
}
public static PublicKey loadPublicKey(String stored) throws GeneralSecurityException {
byte[] data = base64Decode(stored);
X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
KeyFactory fact = KeyFactory.getInstance("DSA");
return fact.generatePublic(spec);
}
public static String savePrivateKey(PrivateKey priv) throws GeneralSecurityException {
KeyFactory fact = KeyFactory.getInstance("DSA");
PKCS8EncodedKeySpec spec = fact.getKeySpec(priv,
PKCS8EncodedKeySpec.class);
byte[] packed = spec.getEncoded();
String key64 = base64Encode(packed);
Arrays.fill(packed, (byte) 0);
return key64;
}
public static String savePublicKey(PublicKey publ) throws GeneralSecurityException {
KeyFactory fact = KeyFactory.getInstance("DSA");
X509EncodedKeySpec spec = fact.getKeySpec(publ,
X509EncodedKeySpec.class);
return base64Encode(spec.getEncoded());
}
public static void main(String[] args) throws Exception {
KeyPairGenerator gen = KeyPairGenerator.getInstance("DSA");
KeyPair pair = gen.generateKeyPair();
String pubKey = savePublicKey(pair.getPublic());
PublicKey pubSaved = loadPublicKey(pubKey);
System.out.println(pair.getPublic()+"\n"+pubSaved);
String privKey = savePrivateKey(pair.getPrivate());
PrivateKey privSaved = loadPrivateKey(privKey);
System.out.println(pair.getPrivate()+"\n"+privSaved);
}
关于java - 将字符串转换为加密 key ,反之亦然java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9755057/
我正在使用框架的对象编写一个用于加密/解密的简单库。方法如下: public static byte[] Encrypt(byte[] key, byte[] vector, byte[] input
据我所知,RIM Crypto API 似乎只提供用于对称加密 (3Des) 的 PKCS5 填充模式。我正在使用 JDE 4.6.0。 我正在尝试为黑莓应用程序提供密码学,该应用程序需要与已经使用标
我已经获得了用于加密的 Java 实现,但遗憾的是我们是一家 .net 商店,我无法将 Java 整合到我们的解决方案中。可悲的是,我也不是 Java 专家,所以我已经为此苦苦挣扎了几天,我想我终于可
我正在尝试使用 KMS 和 AWS 加密 SDK 加密数据。查看 AWS documentation 中提供的示例,似乎没有地方可以明确设置数据 key 。 我找到了 EncryptionMateri
我目前有一个用于为我的网站制作哈希的代码,该代码使用 SALT 进行哈希处理,因此密码是不可逆的...... 目前它是 100% 为我的网站工作,它是使用 ASP.NET(C#) 编码的 这是我的代码
我想要做的是在 javascript 中生成一个 key 对,并在 PHP 中使用这些加密,然后用 JS 解密。 我在附加的代码中有两个问题 它不会从装甲文本块重新加载私钥 并且它不会解密 PHP 加
在进行密码哈希时,我有以下 node.js 代码。 body.password = covid@19 salt = "hello@world" body.passwordhex = crypto.cr
我想知道的是在配置文件中加密连接字符串的明确方法。以下是我的问题: 使用机器级加密,访问我的服务器的任何人都不能编写一个小的 .Net 程序来读取连接字符串的内容吗? 如果我将我的应用程序部署到企业环
我知道 rsync 可以在文件传输期间启用/禁用 ssh 加密协议(protocol)。那么,如果 ssh 加密协议(protocol)被禁用了,是不是意味着 rsync 根本不做任何加密呢? 另外,
脚本必须搜索网页内的字符串。但该脚本不应显示它正在搜索的字符串。我的意思是搜索字符串应该采用加密格式或任何其他格式。但如果没有该搜索字符串,则不应显示网页或应在页面上显示错误。 我要开发一个插件。如果
我正在尝试加密 MySQL 上的某些字段。我正在使用 TPC-DS 的 v2.8 版本,并尝试在客户地址表的某些列上使用 AES。知道如何加密字段的所有行吗?我尝试使用 UPDATE customer
我需要一个简单的 javascript 函数,它允许我使用 key 加密 textarea 数据( key 是存储为散列 session 变量的用户密码,由 PHP 打印到字段中) 我基本上希望在用户
如何在 JavaScript 中散列/加密字符串值?我需要一种机制来隐藏 localStorage/cookie 中的一些数据吗? 这与安全问题有关,但我想为我的数据提供一些保护。 最佳答案 有很多
我有一个程序,其中数据库的密码由远程用户设置。该程序将用户名和密码保存到 xml 文件中的加密字符串中,否则应该是人类可读的。现在,这工作正常,我使用带有 key 的 C# DES 加密,它被加密和解
Kotlin 中是否有任何关于椭圆曲线加密的信息? 用于生成 key 对和加密、解密消息。 关于这个主题的信息很少甚至没有。 例如,我想实现 ECC P-521 椭圆曲线。 是否可以在 Kotlin
所以我知道 MD5 在技术上是新应用程序的禁忌,但我随机想到了这个: 自 md5($password); 不安全,不会 md5(md5($password)) 是更好的选择?我使用它的次数越多,它会变
我一直在努力使用 crypto_secretbox_easy() 在 libsodium 中加密/解密一些数据| .我似乎找不到关于使用的任何好的文档。 我想从用户那里获取密码,用它来以某种方式制作
我正在做一个加密项目 视频,我对这个程序有几个问题。 我用命令转码mp4至HLS与 ts段持续时间约为 10 秒。 首先,我需要使用数据库中的 key 加密这些视频。然而, 我不知道是否使用 ffmp
我有一个加密/复制保护问题。 我正在为使用加密狗的公司编写应用程序。请不要告诉我软件保护是没有用的,或者我应该让它自由地飞向空中,或者我花任何时间这样做都是浪费;这不是关于软件保护有效性的哲学问题,更
我对 有一个疑问VIM 加密 key . 我有一个文本文件,我使用加密该文件 :X 现在,加密 key 的存储位置(路径)。 无论是存储在单独的文件中还是存储在文本文件本身中。 如果我打开文件,它会询
我是一名优秀的程序员,十分优秀!