Member 13084135 Ответов: 1

Шифрование Javascript с использованием RSA совместимо С.Сеть с использованием библиотеки надувного замка


Мне нужно сделать шифрование RSA с помощью javascript для пароля входа пользователя, который отправляется со страницы входа в веб-приложение на сервер для расшифровки библиотекой C#, предоставляемой http://www.bouncycastle.org/csharp.

используя следующий код:
// Generate public key using RSA encryption
protected void Session_Start(object sender, EventArgs e)
        {
            if (System.Runtime.Caching.MemoryCache.Default.Get("privateKey") == null)
            {
                RsaKeyPairGenerator rsaKeyPairGnr = new RsaKeyPairGenerator();
                rsaKeyPairGnr.Init(new Org.BouncyCastle.Crypto.KeyGenerationParameters(new SecureRandom(), 1024));
                Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair keyPair = rsaKeyPairGnr.GenerateKeyPair();

                SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keyPair.Public);

                var pubKeyPEM = FormatPem(publicKeyInfo.GetEncoded().ToBase64(), "PUBLIC KEY");
                RsaKeyParameters publicKey = (RsaKeyParameters)keyPair.Public;
                RsaKeyParameters privateKey = (RsaKeyParameters)keyPair.Private;

                System.Runtime.Caching.MemoryCache.Default.Add("publicKey", pubKeyPEM, DateTimeOffset.MaxValue);
                System.Runtime.Caching.MemoryCache.Default.Add("publicKeyX", publicKey, DateTimeOffset.MaxValue);
                System.Runtime.Caching.MemoryCache.Default.Add("privateKey", privateKey, DateTimeOffset.MaxValue);
            }
        }
		
// Convert SubjectPublicKeyInfo object to PEM format
private static string FormatPem(string pem, string keyType)
        {
            var sb = new StringBuilder();
            sb.AppendFormat("-----BEGIN {0}-----\n", keyType);

            int line = 1, width = 64;

            while ((line - 1) * width < pem.Length)
            {
                int startIndex = (line - 1) * width;
                int len = line * width > pem.Length
                              ? pem.Length - startIndex
                              : width;
                sb.AppendFormat("{0}\n", pem.Substring(startIndex, len));
                line++;
            }

            sb.AppendFormat("-----END {0}-----\n", keyType);
            return sb.ToString();
        }

//Login aspx : javascript code for the login button get public key and password and encrypt using JSEncrypt library
<asp:Button ID="LoginButton" runat="server" OnClientClick="onLoginButtonClicked()" CommandName="Login" Text="Log In" ValidationGroup="Login1" />

    function onLoginButtonClicked() {
			var key = $("#&lt;%= hdnkey.ClientID%>").val();
            var password = $("#Login1_Password").val();
            var encrypt = new JSEncrypt();
            encrypt.setPublicKey(key);
            var encrypted = encrypt.encrypt(password);
            $("#&lt;%= hdnEncryptedPass.ClientID%>").val(encrypted);
        }


//Login aspx.cs
 protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;
            if (System.Runtime.Caching.MemoryCache.Default.Get("publicKey") != null)
            {
                var publicKey = System.Runtime.Caching.MemoryCache.Default.Get("publicKey");
                this.hdnkey.Value = publicKey.ToString();
            }
		}
		
// servre side code that decrypt the encrypted password using the private key
// it gives error while decrypt in the follwoing line
// byte[] deciphered = cipher.ProcessBlock(ciphered, 0, ciphered.Length);
//the error message is: input too large for RSA cipher.
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
        {
            try
            {
                RsaKeyParameters privateKey = (RsaKeyParameters)System.Runtime.Caching.MemoryCache.Default.Get("privateKey");
                
                string encrypted = this.hdnEncryptedPass.Value;

                SHA512Managed hash = new SHA512Managed();
                SecureRandom randomNumber = new SecureRandom();
                byte[] encodingParam = hash.ComputeHash(Encoding.UTF8.GetBytes(randomNumber.ToString()));

                IAsymmetricBlockCipher cipher = new RsaEngine();
                UTF8Encoding utf8enc = new UTF8Encoding();
                
                cipher.Init(false, privateKey);
                byte[] ciphered = Encoding.UTF8.GetBytes(encrypted);
                byte[] deciphered = cipher.ProcessBlock(ciphered, 0, ciphered.Length);
                var pass = utf8enc.GetString(deciphered);
            }
            catch (Exception ee)
            {

                throw;
            }

            e.Authenticated = Membership.ValidateUser(Login1.UserName, Login1.Password);
        }


Что я уже пробовал:

я попробовал .Сетевая библиотека включена www.bouncycastle.org/csharp но это только серверный код.мне нужен код javascript, который сделал шифрование с помощью шифрования RSA и совместим с шифрованием RSA, реализованным с помощью C# и .NET framework библиотекой bouncy castle.
я попробовал использовать javascript-библиотеку Jscript, но она потерпела неудачу.
** код Javascript шифрует пароль и отправляет его на сервер с большей длиной, чем размер, который принимает метод дешифрования.

F-ES Sitecore

Шифрование работает только в том случае, если ключи секретны, но в javascript все открыто, поэтому вы не можете держать ключи в секрете. Google "RSA javascript", и если вы не находите никаких решений, почему вы так думаете? Как уже упоминалось в решении 1, то, что вы делаете, не имеет реальной заслуги, вам нужно сказать, почему вы хотите реализовать это, и посмотреть, есть ли у кого-то решение, поскольку это не так.

1 Ответов

Рейтинг:
0

Richard Deeming

Не.

Серьезно, не надо.

Как вы думаете, какую защиту это может предложить?

Если вы пытаетесь помешать кому-то подслушивать общение с вашим сайтом, получите SSL-сертификат. Это не только автоматически зашифрует связь между вашим сервером и клиентом, но и удалит "небезопасные" предупреждения, которые все современные браузеры добавляют на любую страницу с формой входа, обслуживаемой по протоколу HTTP.

Как избежать предупреждения о небезопасности в Chrome |  Сеть  |  Разработчики Google[^]
Сообщение об опасностях небезопасного http / Mozilla Security Blog[^]

В зависимости от ваших требований, это может даже не стоить вам никаких денег: Давайте шифровать-бесплатные сертификаты SSL/TLS[^]

Без SSL-сертификата все, чего добьется ваш код, - это не дать злоумышленнику прочитать исходный пароль. Это не помешает им захватить зашифрованный пароль и использовать его для аутентификации в качестве пользователя на вашем сайте.