SMTP с CRAM-MD5 в Java

Я не думаю, что вы можете изменить привязку динамически (по крайней мере, в XAML). Однако вы можете сделать следующее:

<StackPanel>
    <ComboBox SelectedIndex="{Binding SelectedIndex}" Margin="2" Width="100">
        <ComboBoxItem Tag="X">X</ComboBoxItem>
        <ComboBoxItem Tag="Y">Y</ComboBoxItem>
    </ComboBox>

    <Slider Value="{Binding SliderValue}"></Slider>
</StackPanel>

Slider теперь связано с другим свойством (SliderValue). Вот дополнительные свойства вашей модели вида:

private int _selectedIndex;
public int SelectedIndex
{
    get { return _selectedIndex; }
    set
    {
        _selectedIndex = value;
        NotifyPropertyChanged();

        if (SelectedIndex == 0)
            SliderValue = XValue;
        else if (SelectedIndex == 1)
            SliderValue = YValue;
    }
}

private int _sliderValue;
public int SliderValue
{
    get { return _sliderValue; }
    set
    {
        _sliderValue = value;
        NotifyPropertyChanged();

        if (SelectedIndex == 0)
            XValue = SliderValue;
        else if (SelectedIndex == 1)
            YValue = SliderValue;
    }
}

Идея состоит в том, что когда SelectedItem изменяется через ComboBox, Slider обновляется либо XValue, либо [118 ]. Когда значение Slider изменяется, значение XValue или YValue обновляется в зависимости от выбора ComboBox.

6
задан Chris Jester-Young 9 October 2008 в 11:41
поделиться

5 ответов

Это не помогает Вам непосредственно, однако, соединения IMAP в JavaMail действительно поддерживают SASL (и таким образом CRAM-MD5, посмотрите Java документация SASL), если Вы устанавливаете mail.imap.sasl.enable булево свойство к true.

К сожалению, существует нет mail.smtp.sasl.enable свойство и SASL не могут быть включены для SMTP в JavaMail.:-(

Однако можно загрузить исходный код JavaMail, и можно попытаться отредактировать код SMTP для поддержки SASL подобным образом к коду IMAP.Удачи!

4
ответ дан 8 December 2019 в 04:11
поделиться

Очень Простая программа CRAMMD5 в JAVA


import java.security.*;

class CRAMMD5Test
{
public static void main(String[] args) throws Exception
{
    // This represents the BASE64 encoded timestamp sent by the POP server
    String dataString = Base64Decoder.decode("PDAwMDAuMDAwMDAwMDAwMEBteDEuc2VydmVyLmNvbT4=");
    byte[] data = dataString.getBytes();

    // The password to access the account
    byte[] key  = new String("password").getBytes();

    // The address of the e-mail account
    String user = "client@server.com";

    MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.reset();

    if (key.length > 64)
        key = md5.digest(key);

    byte[] k_ipad = new byte[64];
    byte[] k_opad = new byte[64];

    System.arraycopy(key, 0, k_ipad, 0, key.length);
    System.arraycopy(key, 0, k_opad, 0, key.length);

    for (int i=0; i<64; i++)
    {
        k_ipad[i] ^= 0x36;
        k_opad[i] ^= 0x5c;
    }

    byte[] i_temp = new byte[k_ipad.length + data.length];

    System.arraycopy(k_ipad, 0, i_temp, 0, k_ipad.length);
    System.arraycopy(data, 0, i_temp, k_ipad.length, data.length);

    i_temp = md5.digest(i_temp);

    byte[] o_temp = new byte[k_opad.length + i_temp.length];

    System.arraycopy(k_opad, 0, o_temp, 0, k_opad.length);
    System.arraycopy(i_temp, 0, o_temp, k_opad.length, i_temp.length);

        byte[] result = md5.digest(o_temp);
        StringBuffer hexString = new StringBuffer();

        for (int i=0;i < result.length; i++) {
                hexString.append(Integer.toHexString((result[i] >>> 4) & 0x0F));
                hexString.append(Integer.toHexString(0x0F & result[i]));
             }


        System.out.println(Base64Encoder.encode(user + " " + hexString.toString()));
    }
}
4
ответ дан 8 December 2019 в 04:11
поделиться

Это, вероятно, не поможет, Вы, но CRAM-MD5 и CRAM-SHA1 довольно легки реализовать предположение, что у Вас есть корректная библиотека (md5/sha1) и, идеально, библиотека кодирования base64 (хотя материал base64 довольно легок реализовать себя в повышении).

Транзакция похожа на это:

C: AUTH CRAM-MD5
S: 334 BASE64(NONCE)
C: BASE64(USERNAME, " ", MD5((SECRET XOR opad),MD5((SECRET XOR ipad), NONCE)))
S: 235 Authentication succeeded

Где ДАННЫЙ СЛУЧАЙ однажды строка проблемы времени, ИМЯ ПОЛЬЗОВАТЕЛЯ является именем пользователя, которое Вы пытаетесь аутентифицировать, СЕКРЕТ является общим секретом ("пароль"), opad является 0x5C, и iPad является 0x36.

(CRAM-SHA1 был бы той же транзакцией, но использующий SHA1 () вместо MD5 (), чтобы сделать переваривание),

Так, вот пример реальной транзакции CRAM-MD5

C: AUTH CRAM-MD5
S: 334 PDQ1MDMuMTIyMzU1Nzg2MkBtYWlsMDEuZXhhbXBsZS5jb20+
C: dXNlckBleGFtcGxlLmNvbSA4YjdjODA5YzQ0NTNjZTVhYTA5N2VhNWM4OTlmNGY4Nw==
S: 235 Authentication succeeded

При резервном копировании процесса шаг Вы добираетесь:

S: 334 BASE64("<4503.1223557862@mail01.example.com>")
C: BASE64("user@example.com 8b7c809c4453ce5aa097ea5c899f4f87")

Резервное копирование одного шага вперед к перед обзором вычисляется, Вы добираетесь:

S: 334 BASE64("<4503.1223557862@mail01.example.com>")
C: BASE64("user@example.com ", MD5(("password" XOR opad),MD5(("password" XOR ipad), "<4503.1223557862@mail01.example.com>")))

Я предполагаю, что это довольно сбивает с толку теперь, когда я выписываю его, но доверяю мне, по сравнению с попыткой сделать NTLM/SPA вручную, это - бриз. Если Вы мотивированы, на самом деле довольно легко реализовать. Или возможно я только что потратил путь к долго с моими руками в кишках почтовых клиентов и серверов для размышления об этом ясно больше...

4
ответ дан 8 December 2019 в 04:11
поделиться

Изменение:

for (int i=0; i<result.length; i++)
  hexString.append(Integer.toHexString(0xFF & result[i]));

Кому:

for (int i=0;i < result.length; i++) {
  hexString.append(Integer.toHexString((result[i] >>> 4) & 0x0F));
  hexString.append(Integer.toHexString(0x0F & result[i]));
}
1
ответ дан 8 December 2019 в 04:11
поделиться

Я попробовал код примера реальной транзакции CRAM-MD5, и также на примере, данном в RFC 2195.

Это не работает, потому что преобразование в шестнадцатеричную строку не корректно. Для экс-клена, с этим кодом, Вы получите "b913a62c7eda7a495b4e6e7334d3890" вместо "b913a602c7eda7a495b4e6e7334d3890", и отправленная строка аутентификации не будет корректна.

При загрузке исходного кода javaMail Вы будете видеть реализацию функции toHex в единицу "DigestMD5". Используя это преобразование, это будет работать.

2
ответ дан 8 December 2019 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: