권장 유니티 버전 : 2022
텍스쳐를 암호화 시킨 후, 셰이더를 이용하여 텍스쳐를 복호화합니다.
아바타 복사를 막아주고 리핑을 통해 아바타의 텍스쳐를 뜯어가서 수정하는 것을 막을 수 있습니다.
OSC 프로그램으로 간편하게 비밀번호를 입력할 수 있습니다.
OSC 소스 코드: https://github.com/Shell4026/ShellProtectorOSC
- Poiyomi 7.3(불안정), 8.0, 8.1, 8.2, 9.0, 9.1(pro), PCSS(테스트 더 필요)
- lilToon (1.3.8 ~ 1.7.3)(VCC)
- RGB24, RGBA32
- DXT1, DXT5
- Crunch Compression 포멧은 자동으로 DXT1이나 DXT5로 변환 됩니다.
- 텍스쳐 암호화
- 암호화를 풀기 위한 OSC 프로그램
- 쉐이프키 난독화
- 폴백: 친구가 아닌 유저에게는 암호화 노이즈 대신 16x16 텍스쳐로 보이게 하는 기능
- 아바타를 우클릭해 'Shell Protector'를 눌러 컴포넌트를 추가합니다.
- 비밀번호를 설정해주고 암호화 할 메테리얼이나 게임오브젝트를 지정해줍니다.
(모듈러 사용시 아래 과정은 필요 없습니다.)
- Encrypt 버튼을 누르세요.
- 새로 생긴 아바타에 들어간 Testor컴포넌트를 통해 암호화 여부를 확인하고 완료 버튼을 누르세요.
- 아바타를 업로드 합니다.
- Release에 있는 ShellProtectorOSC.zip을 다운 후 압축을 풀고 ShellProtectorOSC.exe를 실행시킵니다. (최초 한 번만 실행하면 됩니다. 리셋 아바타나 파라미터 멀티플렉싱을 사용한다면 계속 켜두세요.)
- 업로드 한 아바타로 바꾼 후 OSC프로그램에서 사용자 비밀번호를 입력합니다.
- 만약 비밀번호가 바뀌어도 아바타의 외형에 변화가 없다면 VRChat에서 액션 메뉴 - Options - OSC - Reset Config를 눌러보세요.
- 그래도 문제가 있다면 C:\Users\유저\AppData\LocalLow\VRChat\VRChat\OSC 폴더를 지워보세요.
세부 원리:https://github.com/seanedwards/vrc-worldobject/blob/main/docs/parameter-multiplexing.md
파라미터 절약 기술입니다. 체크 후 OSC를 항상 켜둬야하며 OSC프로그램에도 Parameter-multiplexing을 체크 해야합니다.
인게임에서 원래 모습으로 돌아오기까지 시간이 약간 증가합니다.
16자리는 혹시 모를 파라미터 관련 VRChat보안 이슈가 있을 수 있으니 12자리를 권장합니다.
파라미터 멀티플렉싱 사용시 서버나 네트워크 상황에 따라 다른 유저에게 OSC값이 전달이 안 돼어 복호화가 안 될 수 있습니다.
이 경우 OSC 1.5.0에 추가된 Refresh rate를 조금 올려보시길 바랍니다.
암호화가 걸려있을 때 세이프티가 켜져있는 사람은 아바타를 볼 때 열화된 버전으로 보이게 하는 기능입니다.
<릴툰) 인게임에서 특정 부위만 암호화가 안 풀리는 경우>
정확한 원인은 파악중이지만 VCC용 릴툰을 사용하지 않는 경우와 백라이트를 사용하고 있는 경우 생길 수 있는 것 같습니다. 문제 발견 시 Issues에 올려주시면 감사하겠습니다.
<is not supported texture format! 에러>
텍스쳐를 선택 후 Inspector에서 압축 포멧을 DXT1이나 DXT5중 하나로 바꿔주세요. (투명도가 있는 텍스쳐는 DXT5)
<릴툰)Testor컴포넌트로 테스트 했을 때 원래대로 안 돌아오는 경우>
릴툰의 버그이므로 무시하고 업로드 하거나 3가지 방법 중 하나를 해보세요.
- ShellProtect 폴더 안에 생긴 자기 아바타 폴더를 지우고 다시 암호화 하기
- 유니티를 재실행 해보세요.
- Assets - liltoon - Refresh Shader를 눌러보기 (오래 걸림!)
<특정 부위가 단색으로 보이는 경우>
릴툰의 경우 메테리얼의 메인 컬러 부분과 custom properties의 Encrypted texture부분에 암호화 된 텍스쳐가 빠져 있는지 확인하고 넣어주세요.
포이요미의 경우 다시 암호화 해보세요.
<인게임에서 남이 봤을 때 암호화가 안 풀리는 경우>
남이 셰이더와 애니메이션 세이프티를 끄거나 당신을 Show Avatar해야합니다.
그랬는데도 그러면 VRChat 파라미터 동기화 버그로, 비밀번호를 변경 후 다시 업로드 하길 바랍니다.
파라미터 멀티플렉싱 사용시 서버나 네트워크 상황에 따라 다른 유저에게 OSC값이 전달이 안 돼어 복호화가 안 될 수 있습니다.
이 경우 OSC 1.5.0에 추가된 Refresh rate를 조금 올려보시길 바랍니다.
<메테리얼에서 있던 텍스쳐가 빠지는 경우>
메인 컬러와 같은 텍스쳐 사용시 보안상의 이유로 해당 텍스쳐는 빠집니다.
예외로, 림라이트, 아웃라인 텍스쳐는 빠지지 않고 그대로 암호화된 텍스쳐를 사용합니다.
SHA-256으로 키를 변형 후 XXTEA 알고리즘을 사용하여 메테리얼의 MainTexure를 암호화합니다.
압축 텍스쳐는 색만 암호화하여 용량을 줄입니다. 원본 텍스쳐의 형태는 일부 남아있습니다.
텍스쳐 자체를 암호화 한 후 VRChat 서버에 업로드 됩니다. 이 텍스쳐는 게임에서 셰이더를 통해 복호화 시킵니다.
셰이더와 메테리얼은 복사 되기 때문에 원본에 영향이 없습니다.
MainTexture만 암호화 하기 때문에 메테리얼 내 다른 곳에 MainTexture와 동일한 텍스쳐를 쓴다면 보안을 위해 자동으로 빠집니다. 빠진 곳엔 적절한 텍스쳐를 채워 넣으세요.
예외로 림라이트 텍스쳐와 아웃라인 텍스쳐가 메인 텍스쳐와 같은 텍스쳐일 경우 MainTexture와 같은 암호화된 텍스쳐를 사용합니다.
메모리는 원본보다 조금 더 차지합니다. 2K DXT1 이미지 기준 1mb정도 커집니다.
포이요미가 릴툰보다 성능이 좋습니다.
<대략적인 포이요미 GPU 측정 결과>
기본 : 0.1ms
Point필터링: 0.2ms
Bilinear 필터링: 0.35ms
그렇게 큰 차이는 아닌 것으로 보이나, 성능을 생각하면 꼭 필요한 텍스쳐만 암호화 하는 것을 추천합니다.
기본적으로 16바이트의 키를 가지며, 셰이더 내부에 저장되는 키와 사용자가 VRC 파라미터를 이용하여 입력할 수 있는 키로 나누어져 있습니다. (사용자 키라고 부르겠습니다.)
0바이트의 사용자 키는 컴파일된 셰이더를 어셈블리어로 바꾸고 분석하기만 하면 알아낼 수 있습니다.
4바이트의 사용자 키는 누군가 시간만 들이면 키를 알아낼 수 있습니다. (4바이트 키 = 파라미터 32칸 / 11칸(파라미터 멀티플렉싱 사용시))
8바이트의 사용자 키는 개인용 컴퓨터로는 알아내는데 시간이 많이 걸릴 것입니다. (8바이트 키 = 파라미터 64칸 / 12칸)
12바이트의 사용자 키부터는 현대 컴퓨터로는 알아낼 수 없습니다. (12바이트 키 = 파라미터 96칸 / 13칸)
최소 12바이트의 키를 써서 사용자 키의 수를 늘린다면 안전합니다. 자신의 파라미터 공간을 생각해서 키를 설정하시길 바랍니다.
0바이트의 사용자 키는 최소한의 방어라고 보면 되고, 단순 툴을 이용한 툴키디들을 막아내는데는 효과적일 것입니다.
세상에 완벽한 보안은 없으며 해당 방법도 쉽지는 않지만, 누군가 같은 월드내에서 집요하게 사용자의 네트워크 패킷을 분석한다면 알아낼 가능성이 존재합니다.
하지만 누군가 사용자의 아바타를 무차별적으로 뜯어내 어딘가에 공유하는 방식은 충분한 키 사이즈를 가지고 있다면 100% 막아낼 수 있습니다.
- BC7 지원