Java怎么把某些参数(key=value)加密成密文保存在文件上, 在使用该软件系统时候,读取该文件,进行解密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java怎么把某些参数(key=value)加密成密文保存在文件上, 在使用该软件系统时候,读取该文件,进行解密相关的知识,希望对你有一定的参考价值。

最好只用java自带的类来写,希望写完整一点。最好能带个注释。。。怕看不懂。。。
我刚接触Java不久。不太会。望大家能帮我下。。。。。。或者发我邮箱ccx4490@foxmail.com
要可以加密 同时 程序也可以解密的

参考技术A public class Md5Utils
public static byte[] md5(byte[] data)
try
MessageDigest md =
MessageDigest.getInstance("md5");
md.update(data);
return md.digest();
catch (NoSuchAlgorithmException e)
e.printStackTrace();
throw new RuntimeException(e);



public static String md5(String data)
try
byte[] md5 = md5(data.getBytes("utf-8"));
return toHexString(md5);
catch (UnsupportedEncodingException e)
e.printStackTrace();

return "";


public static String toHexString(byte[] md5)
StringBuilder buf = new StringBuilder();
for (byte b : md5)
buf.append(leftPad(
Integer.toHexString(b&0xff), '0', 2));

return buf.toString();

public static String leftPad(
String hex, char c, int size)
char[] cs = new char[size];
Arrays.fill( cs, c);
System.arraycopy(hex.toCharArray(), 0,
cs, cs.length-hex.length(), hex.length());
return new String(cs);

追问

该方法,加密后能解密吗?因为我是要把敏感数据写到文件加密起来 程序运行时在读取解密来核对的。。。。

参考技术B 非对称加密:加密的方法很多java有RSA加密和SSL加密的,你想使用哪个呢?

最简单的是base64加密的,对称加密追问

都可以哦,只要能加密的 当然是越复杂越好了,能提供下方法吗 谢谢了

参考技术C 在baidu找md5或base64追问

怎么写啊 。。。就是不懂啊。。。。刚接触Java的

如何把OpenSSH公钥转换成OpenSSL格式

首先看看OpenSSL工具的简单使用方法,我们以rsa加密算法为例
生成一个私钥:
openssl genrsa -out private.key 1024
-out指定生成私钥文件名 1024是生成密钥的长度
利用私钥生成对应的公钥:
openssl rsa -in private.key -pubout -out public.key
-in 指定的私钥,-out 指定公钥文件名
加密文件:
openssl rsautl -encrypt -in test -inkey public.key -pubin -out test_encrypt
-in 指定加密的文件,-inkey 指定公钥,-pubin表明是用纯公钥文件加密,-out为加密后的密文文件
解密文件:
openssl rsautl -decrypt -in test_encrypt -inkey private.key -out test_decrypt
-in指定加密后的密文文件,-inkey指定公钥对应的私钥,-out为解密后的文件。
然后你就可以直接diff一把原文件和test_decrypt,看看是不是一样了

不过玩过OpenSSL的兄弟一定知道,OpenSSL生成的公钥跟OpenSSH的公钥虽然来自同一个私钥,不过格式却完全不一样
这就是很多兄弟遭遇悲剧的所在,因为OpenSSH的公钥借助ssh的互信可以在authorized_key中非常容易就得到
不过这个openssh的公钥格式不一样,没法用openssl加密
openssl的公钥例子:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk
O3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2
eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1
QWPdspTBKcxeFbccDwIDAQAB
-----END PUBLIC KEY-----
openssh的公钥例子:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC7vbqajDw4o6gJy8UtmIbkcpnkO3Kwc4qsEnSZp/TR+fQi62F79RHWmwKOtFmwteURgLbj7D/WGuNLGOfa/2vse3G2eHnHl5CB8ruRX9fBl/KgwCVr2JaEuUm66bBQeP5XeBotdR4cvX38uPYivCDdPjJ1QWPdspTBKcxeFbccDw==
不过还好这个早就不是什么新问题了,如果是OpenSSH v.5.6或者以上版本,可以用下面的命令生成(这个没验证过,确实找不到这么高版本的环境)
ssh-keygen -f key.pub -e -m pem
不过你的OpenSSH还没这么高版本,也不想费劲去升级依赖的一堆库文件,也有用代码实现的方式
附上python实现代码:
#!/usr/bin/env python
# with help and inspiration from
# * ASN1_generate_nconf(3) (specifically the SubjectPublicKeyInfo structure)
# * http://www.sysmic.org/dotclear/index.php?post/2010/03/24/Convert-keys-betweens-GnuPG%2C-OpenSsh-and-OpenSSL
# * http://blog.oddbit.com/2011/05/converting-openssh-public-keys.html
import sys
import base64
import struct
from pyasn1.type import univ
from pyasn1.codec.der import encoder as der_encoder, decoder as der_decoder
if len(sys.argv) != 2:
sys.stderr.write("Usage: %s \\n" % sys.argv[0])
sys.exit(1)
keyfields = open(sys.argv[1]).read().split(None)
if len(keyfields) I\', keydata[:4])[0]
# read in bytes
data, keydata = keydata[4:dlen+4], keydata[4+dlen:]
parts.append(data)
e_val = eval(\'0x\' + \'\'.join([\'%02X\' % struct.unpack(\'B\', x)[0] for x in parts[1]]))
n_val = eval(\'0x\' + \'\'.join([\'%02X\' % struct.unpack(\'B\', x)[0] for x in parts[2]]))
bitstring = univ.Sequence()
bitstring.setComponentByPosition(0, univ.Integer(n_val))
bitstring.setComponentByPosition(1, univ.Integer(e_val))
bitstring = der_encoder.encode(bitstring)
bitstring = \'\'.join([(\'00000000\'+bin(ord(x))[2:])[-8:] for x in list(bitstring)])
bitstring = univ.BitString("\'%s\'B" % bitstring)
pubkeyid = univ.Sequence()
pubkeyid.setComponentByPosition(0, univ.ObjectIdentifier(\'1.2.840.113549.1.1.1\')) # == OID for rsaEncryption
pubkeyid.setComponentByPosition(1, univ.Null(\'\'))
pubkey_seq = univ.Sequence()
pubkey_seq.setComponentByPosition(0, pubkeyid)
pubkey_seq.setComponentByPosition(1, bitstring)
print "-----BEGIN PUBLIC KEY-----"
if keycomment:
print "X-Comment: " + keycomment
print
base64.MAXBINSIZE = (64//4)*3 # this actually doesn\'t matter, but it helped with comparing to openssl\'s output
print base64.encodestring(der_encoder.encode(pubkey_seq)),
print \'-----END PUBLIC KEY-----\'
转载,仅供参考,祝你愉快,满意请采纳。
参考技术A   在FB服务器上进入用户的.ssh目录下,把SSH Secure Shell Client格式的公钥转换成Openssl格式的公钥。
  #cd /usr/home/user1/.ssh/
  #ssh-keygen -X -f 12.pub >> authorized_keys ;转换格式并将公钥导入到;authorized_keys文件中
  #chmod 0640 authorized_key ;设置权限,使该文件仅允许属主读写;
  #rm 12.pub ;删除上传的公钥;

以上是关于Java怎么把某些参数(key=value)加密成密文保存在文件上, 在使用该软件系统时候,读取该文件,进行解密的主要内容,如果未能解决你的问题,请参考以下文章

java中如何把hashmap转换成object数组

如何把OpenSSH公钥转换成OpenSSL格式

JAVA中put()中的参数是怎么使用的

android怎么把json转换为hashmap

怎么用js写自定义key的base64加密

怎么把js中通过url同时传多个参数怎么写