Java开发中的加密、解密、签名、验签,密钥,证书(上篇)

OpenSSL和keytool先说一下两个重要的工具

  • OpenSSL:OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl、应用程序命令工具以及密码算法库libcrypto 。 它使用标准的文件格式(PEM/CER/CRT/PKCS等)存储密钥和证书信息 。
  • keytool:是密钥和证书管理工具 。 它出自于Java体系 , 它使用KeyStore来管理密钥和证书 。
两者都是可以用来生成加密密钥的工具 , keytool出自Java体系 , 它可以直接操作KeyStore , 而OpenSSL不支持直接操作KeyStore 。 实际情况有可能是这样的 , 使用OpenSSL生成了密钥或证书 , 然后使用keytool将其导入到KeyStore以便在Java环境中使用 。
当然OpenSSL还具备其他功能比如作为SSL的客户端和服务器 , 这是keytool所不具备的 。
对称加密采用单钥密码系统的加密方法 , 同一个密钥可以同时用作信息的加密和解密 , 这种加密方法称为对称加密 , 也称为单密钥加密 。 ——百度百科
对称加密算法的特点
  • 加密和解密使用同样的密钥
  • 计算速度快 , 适用于对大量数据加密处理
  • 安全性取决于算法 , 也取决于密钥的管理 , 一旦密钥泄漏 , 数据则暴露无遗
对称加密算法的使用场景基于上述的特点 , 在一些需要高效实时传输的加密通讯场景中 , 比如使用VPN或者代理进行通讯时 , 可以使用对称加密 。 另外在同一个系统内部不同模块 , 比如前后端 , 从前端输入的敏感信息 , 可以使用对称加密算法进行加密后将密文传到后端 , 避免传输过程中明文被截获 , 因为同系统内部之间密钥管理相对容易 , 而对于共享密钥有泄漏风险的其他任何场景 , 则不适合使用对称加密算法进行加密 。
常见的对称加密算法算法 描述 DES(Data Encryption Standard) 数据加密标准 , 速度较快 , 适用于加密大量数据 3DES(Triple DES) 基于DES , 对一块数据用三个不同的密钥进行三次加密 , 强度更高 AES(Advanced Encryption Standard) 高级加密标准 , 速度快 , 安全级别高 , 支持128、192、256、512位密钥的加密 Blowfish 速度快且安全 , 而且没有专利和商业限制 。 了解更多>>
OpenSSL实现对称加密OpenSSL> enc --helpusage: enc -ciphername [-AadePp] [-base64] [-bufsize number] [-debug][-in file] [-iv IV] [-K key] [-k password][-kfile file] [-md digest] [-none] [-nopad] [-nosalt][-out file] [-pass arg] [-S salt] [-salt] -AProcess base64 data on one line (requires -a) -aPerform base64 encoding/decoding (alias -base64) -bufsize sizeSpecify the buffer size to use for I/O -dDecrypt the input data -debugPrint debugging information -eEncrypt the input data (default) -in fileInput file to read from (default stdin) -iv IVIV to use, specified as a hexadecimal string -K keyKey to use, specified as a hexadecimal string -md digestDigest to use to create a key from the passphrase -noneUse NULL cipher (no encryption or decryption) -nopadDisable standard block padding -out fileOutput file to write to (default stdout) -PPrint out the salt, key and IV used, then exit(no encryption or decryption is performed) -pPrint out the salt, key and IV used -pass sourcePassword source -S saltSalt to use, specified as a hexadecimal string -saltUse a salt in the key derivation routines (default) -vVerbose命令选项 描述 -in file 被加密文件的全路径 -out file 加密后内容输出的文件路径 -salt 自动插入一个随机数作为文件内容加密 , 默认选项 -e 加密模式 , 默认 -d 解密模式 , 需要与加密算法一致 -a 使用-base64位编码格式 , 也可使用-base64 -pass source 指定密码的输入方式 , 共有五种方式:命令行输入(stdin)、文件输入(file)、环境变量输入(var)、文件描述符输入(fd)、标准输入(stdin) 。 默认是标准输入即从键盘输入
只对文件进行base64编码 , 而不使用加解密/*对文件进行base64编码*/openssl enc -base64 -in plain.txt -out base64.txt/*对base64格式文件进行解密操作*/openssl enc -base64 -d -in base64.txt -out plain2.txt/*使用diff命令查看可知解码前后明文一样*/diff plain.txt plain2.txt不同方式的密码输入方式/*命令行输入 , 密码123456*/openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456/*文件输入 , 密码123456*/echo 123456 > passwd.txtopenssl enc -aes-128-cbc -in plain.txt -out out.txt -pass file:passwd.txt/*环境变量输入 , 密码123456*/passwd=123456export passwdopenssl enc -aes-128-cbc -in plain.txt -out out.txt -pass env:passwd/*从文件描述输入*/ openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass fd:1/*从标准输入输入*/ openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass stdin Java实现对称加密DES/** * 生成 DES 算法密钥 * @return byte[] * @throws Exception */public static byte[] generateDESKey() throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");// must be equal to 56keyGenerator.init(56);SecretKey secretKey = keyGenerator.generateKey();byte[] encodedKey = secretKey.getEncoded();return encodedKey;}/** * DES加密 * @param encodedKey generateDESKey生成的密钥 * @param dataBytes byte[]形式的待加密数据 * @return byte[] * @throws Exception */public static byte[] encryptByDES(byte[] encodedKey, byte[] dataBytes) throws Exception {SecretKey secretKey = new SecretKeySpec(encodedKey, "DES");Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encryptedData = http://kandian.youth.cn/index/cipher.doFinal(dataBytes);return encryptedData;}/** * DES解密 * @param encodedKey generateDESKey生成的密钥 * @param encryptedData byte[]形式的待解密数据 * @return byte[] * @throws Exception */public static byte[] decryptByDES(byte[] encodedKey, byte[] encryptedData) throws Exception {SecretKey secretKey = new SecretKeySpec(encodedKey,"DES");Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decryptedData = http://kandian.youth.cn/index/cipher.doFinal(encryptedData);return decryptedData;}