加密系统设计-实现-问题解决

一. 加密系统设计流程

  1. 使用微信小程序rdSession方式进行加密系统
  2. wx.getUserInfo-(rdSession,rawData,signature)->rdSession存在,签名正确
    <----(对称密钥,iv发送)----
    
  3. scanMessage –(rdSession,rawData,signature)–>rdSession存在,签名正确,scanMessage加密存储

二. 数字签名和加解密

三. 问题解决

1. 后端Ruby on Rails通过OPENSSL::Cipher (OPENSSL::Cipher::Cipher)实现

(1)Encoding::UndefinedConversionError (“\xFA” from ASCII-8BIT to UTF-8)
\xB1I\x0E?4H\x8B}\x85\x82\xEC*8\x8A6\x82\xD6~\x9A\xE8&\xC6V)>\xE5\x0E?\xC6\x863\xC3\xFA\xC7Vz1\xC3\xAD\xB3 \t\x8B\xBD3p…..
Completed 500 Internal Server Error in 366ms (ActiveRecord: 0.3ms)

实际上自动将能够转化为ASCII-8bit的十六进制字符\x转化了,(字节数组:类型为string,每一位为一个十六进制字符),但是在params传播需要UTF-8类型,所以报错。
解决1: asy_key.encode(‘UTF-8’,invalid: :replace,undef: :replace)会导致丢失字符
解决2: unpack(‘H‘) pack(‘H‘) unpack(‘C*’) 转化为16进制的字符串
解决3: 转化为Base64格式进行传送;base64:在字节长度为3的倍数时,生成的加密数据结尾没有=;其他情况下有=

  1. aes-128-cbc加密时,小于16位则加密结果为空。。。。。
    1
    2
    3
    require ‘base64’ 
    Base64.encode64()
    Base64.decode64()

(2) key,iv,final
AES-128-CBC中key和iv必须为16bytes,random_key,random_iv生成key和iv,在+cipher.final格式中生成的key和iv,再次使用该密钥加密或者解密时必须+Cipher.final
(3) 无论encrypt或者decrypt,先new再定义加(解)密格式
sym = OPENSSL::Cipher.new(“aes-128-cbc”)
sym.encrypt //加(解)密格式

2. 前端微信小程序通过crypto-js/crypto-js实现

前端和后端调用不用的库进行AES-128-CBC加密和解密,但是结果不同
Crypto.enc.Base64
Crypto.enc.Utf8 更改编码格式

3. 后端AES加密可以调用gem:AES