Skip to content

Commit 72b9270

Browse files
author
dreamcodestudio
committed
feat: Add Triple DES crypter to store passwords
1 parent 60eb920 commit 72b9270

File tree

9 files changed

+130
-10
lines changed

9 files changed

+130
-10
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
## [1.2.0] - 2023-10-22
4+
- Added Triple DES crypter to store passwords
5+
36
## [1.1.0] - 2022-10-22
47
- MS coding style
58
- Improvements in core structure

Editor/KeystoreSettings.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,46 @@ internal static class KeystoreSettings
1010
public static string AliasName;
1111
public static string AliasPassword;
1212
private const string KeystoreExt = ".keystore";
13+
private static readonly ICrypter _crypter = new TripleDESCrypter(nameof(KeystoreSettings));
1314

1415
public static void Load()
1516
{
17+
var prefsPassword = EditorPrefs.GetString(
18+
$"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(Password)}");
19+
var prefsAliasPassword =
20+
EditorPrefs.GetString(
21+
$"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(AliasPassword)}");
22+
var decryptedPassword = _crypter.Decrypt(prefsPassword);
23+
var decryptedAliasPassword = _crypter.Decrypt(prefsAliasPassword);
24+
1625
Name = EditorPrefs.GetString(
1726
$"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(Name)}");
18-
Password = EditorPrefs.GetString(
19-
$"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(Password)}");
27+
Password = decryptedPassword;
2028
AliasName = EditorPrefs.GetString(
2129
$"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(AliasName)}");
22-
AliasPassword =
23-
EditorPrefs.GetString(
24-
$"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(AliasPassword)}");
30+
AliasPassword = decryptedPassword;
2531
if (EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android)
2632
return;
2733
PlayerSettings.Android.keystoreName = Name + KeystoreExt;
28-
PlayerSettings.Android.keystorePass = Password;
34+
PlayerSettings.Android.keystorePass = decryptedPassword;
2935
PlayerSettings.Android.keyaliasName = AliasName;
30-
PlayerSettings.Android.keyaliasPass = AliasPassword;
36+
PlayerSettings.Android.keyaliasPass = decryptedAliasPassword;
3137
}
3238

3339
public static void Save(string name, string password, string aliasName, string aliasPassword)
3440
{
41+
var encryptedPassword = _crypter.Encrypt(password);
42+
var encryptedAliasPassword = _crypter.Encrypt(aliasPassword);
3543
EditorPrefs.SetString($"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(Name)}",
3644
name);
3745
EditorPrefs.SetString(
38-
$"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(Password)}", password);
46+
$"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(Password)}",
47+
encryptedPassword);
3948
EditorPrefs.SetString(
4049
$"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(AliasName)}", aliasName);
4150
EditorPrefs.SetString(
4251
$"{PlayerSettings.applicationIdentifier}-{nameof(KeystoreSettings)}-{nameof(AliasPassword)}",
43-
aliasPassword);
52+
encryptedAliasPassword);
4453
if (EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android)
4554
return;
4655
PlayerSettings.Android.keystoreName = name + KeystoreExt;

Editor/Security.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Editor/Security/Common.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Editor/Security/Common/ICrypter.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace DreamCode.AutoKeystore.Editor
2+
{
3+
public interface ICrypter
4+
{
5+
string Encrypt(string value);
6+
string Decrypt(string base64String);
7+
}
8+
}

Editor/Security/Common/ICrypter.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using System;
2+
using System.Security.Cryptography;
3+
using System.Text;
4+
using UnityEngine;
5+
6+
namespace DreamCode.AutoKeystore.Editor
7+
{
8+
public sealed class TripleDESCrypter : ICrypter
9+
{
10+
private readonly string _secretKey;
11+
12+
public TripleDESCrypter(string secretKey)
13+
{
14+
_secretKey = secretKey;
15+
}
16+
17+
public string Encrypt(string value)
18+
{
19+
var inputBytes = Encoding.UTF8.GetBytes(value);
20+
var md5ServiceProvider = new MD5CryptoServiceProvider();
21+
var tripleServiceProvider = new TripleDESCryptoServiceProvider();
22+
23+
tripleServiceProvider.Key = md5ServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(_secretKey));
24+
tripleServiceProvider.Mode = CipherMode.ECB;
25+
var cryptoTransform = tripleServiceProvider.CreateEncryptor();
26+
27+
var finalBlock = cryptoTransform.TransformFinalBlock(inputBytes, 0, inputBytes.Length);
28+
return Convert.ToBase64String(finalBlock);
29+
}
30+
31+
public string Decrypt(string base64String)
32+
{
33+
if (string.IsNullOrEmpty(base64String))
34+
return string.Empty;
35+
var result = string.Empty;
36+
try
37+
{
38+
var inputBytes = Convert.FromBase64String(base64String);
39+
var md5ServiceProvider = new MD5CryptoServiceProvider();
40+
var tripleServiceProvider = new TripleDESCryptoServiceProvider();
41+
42+
tripleServiceProvider.Key = md5ServiceProvider.ComputeHash(Encoding.UTF8.GetBytes(_secretKey));
43+
tripleServiceProvider.Mode = CipherMode.ECB;
44+
var cryptoTransform = tripleServiceProvider.CreateDecryptor();
45+
46+
var finalBlock = cryptoTransform.TransformFinalBlock(inputBytes, 0, inputBytes.Length);
47+
result = Encoding.UTF8.GetString(finalBlock);
48+
}
49+
catch (CryptographicException cryptoEx)
50+
{
51+
Debug.LogWarning($"{nameof(TripleDESCrypter)}-{cryptoEx.Message}");
52+
result = base64String;
53+
}
54+
catch (Exception e)
55+
{
56+
Debug.LogError($"{nameof(TripleDESCrypter)}-{e.Message}");
57+
}
58+
59+
return result;
60+
}
61+
}
62+
}

Editor/Security/TripleDESCrypter.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "com.dreamcode.mobile.android-keystore",
33
"displayName": "AutoKeystore",
4-
"version": "1.1.0",
4+
"version": "1.2.0",
55
"unity": "2020.3",
66
"description": "Allows store android keystore between sessions, without manual input everytime.",
77
"keywords": [

0 commit comments

Comments
 (0)