WeChat 애플릿 API 사용자 데이터의 서명 확인과 암호화 및 복호화


서명 확인 및 사용자 데이터 암호화 및 복호화


데이터 서명 확인

개방형 인터페이스에서 반환된 사용자 데이터의 보안을 보장하기 위해 WeChat은 일반 텍스트 데이터에 서명합니다. 개발자는 데이터 무결성을 보장하기 위해 비즈니스 요구 사항에 따라 데이터 패킷에 대한 서명 확인을 수행할 수 있습니다.

  1. 서명 검증 알고리즘은 사용자의 session_key를 포함하며, wx.login 로그인 프로세스를 통해 사용자의 session_key를 획득하고, 애플리케이션 자체의 로그인 상태와 해당 관계를 유지합니다.
  2. 인터페이스(예: wx.getUserInfo)를 호출하여 데이터를 얻을 때 인터페이스는 rawData와 서명을 동시에 반환합니다. 여기서 서명 = sha1( rawData + session_key )
  3. 개발자는 개발자에게 서명과 rawData를 보냅니다. 확인을 위한 서버입니다. 서버는 사용자의 해당 session_key를 이용하여 동일한 알고리즘으로 서명(signature2)을 계산하고, 서명(signature)과 서명2(signature2)를 비교하여 데이터의 무결성을 검증한다.

예를 들어 wx.getUserInfo의 데이터 확인:

인터페이스에서 반환된 rawData:

{
  "nickName": "Band",
  "gender": 1,
  "language": "zh_CN",
  "city": "Guangzhou",
  "province": "Guangdong",
  "country": "CN",
  "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
}

사용자의 세션 키:

HyVFkGl5F5OQWJZZaNzBBg==

따라서 서명에 사용되는 문자열은 다음과 같습니다.

{"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg==

sha1을 사용하여 얻습니다. 결과는

75e81ceda165f4ffa64f4068af58c64b8f54b88c

암호화된 데이터 암호 해독 알고리즘

입니다. 인터페이스에 민감한 데이터(예: wx.getUserInfo의 openId 및 UnionId)가 포함된 경우 인터페이스의 일반 텍스트 콘텐츠에는 이러한 민감한 데이터가 포함되지 않습니다. 개발자가 민감한 데이터를 확보해야 하는 경우 인터페이스에서 반환된 암호화된 데이터(encryptedData)를 대칭적으로 해독해야 합니다. 복호화 알고리즘은 다음과 같습니다.

  1. 대칭 복호화에 사용되는 알고리즘은 AES-128-CBC이며, 데이터는 PKCS#7로 채워집니다.
  2. 대칭 복호화의 대상 암호문은 Base64_Decode(encryptedData),
  3. 대칭 복호화 키 aeskey = Base64_Decode(session_key), aeskey는 16바이트입니다.
  4. 대칭 복호화 알고리즘의 초기 벡터 iv가 데이터 인터페이스에 반환됩니다.

WeChat은 공식적으로 여러 프로그래밍 언어로 샘플 코드를 제공합니다(다운로드하려면 클릭). 인터페이스 이름은 각 언어 유형에 대해 일관됩니다. 호출 방법은 예시를 참조할 수 있습니다.

또한 애플리케이션이 데이터의 유효성을 확인할 수 있도록 민감한 데이터에 데이터 워터마크(워터마크)를 추가합니다

워터마크 매개변수 설명:

QQ截图20170208150911.png

예: 인터페이스 http: //www.w3cschool.cn /weixinapp/weixinapp-open.html 민감한 데이터의 워터마크:

{
    "openId": "OPENID",
    "nickName": "NICKNAME",
    "gender": GENDER,
    "city": "CITY",
    "province": "PROVINCE",
    "country": "COUNTRY",
    "avatarUrl": "AVATARURL",
    "unionId": "UNIONID",
    "watermark":
    {
        "appid":"APPID",
        "timestamp":TIMESTAMP
    }
}

참고: 이전에 제공된 암호화된 데이터(encryptData) 및 해당 암호화 알고리즘은 더 이상 사용되지 않습니다. 오래된 논리에.