May 28, 2018
Black Sesame > White Sesame
black-sesame-white-sesame-2

Nutty, aromatic, and more flavorful than white sesame, there’s a lot more to black sesame besides its cool inky appearance. 

When you think of sesame seeds, what comes to mind may be creamy swirls of tahini, nutty halvas, or dots on top of burger buns. Those tear-shaped little beige seeds, gloriously nutty with a rich, toasty fragrance, have a cousin that while markedly less common in certain parts of the world, is no less impressive. Enter black sesame.

White sesame seeds are usually sold with their tan, brownish hulls removed, revealing the off-white embryo within, whereas black sesame often have their hulls still intact. But aside from color, there’s also a subtle difference in taste. Black sesame seeds have a slightly nuttier, more bitter flavor compared to their sweeter white equivalent. When used in large quantities, the richer, more pungent earthiness of black sesame seeds becomes apparent, making a world of difference in desserts like Japanese kurogoma ice cream or zi maa gyun, black sesame jelly-like rolls popular in Hong Kong.

Across Asia, black sesame makes an appearance in all types of food. It is a common component in furikake (a Japanese spice mix made with dried fish, seaweed, and sesame seeds) and in Indian sweets like chikki and laddu (crunchy brittles and dessert balls made of nuts and spices). Ground into a powder, it works as a nutty coating on mochi and injeolmi (Japanese and Korean sweet rice cakes). In its spreadable form, black sesame paste is often used as a filling for steamed dessert bao or Chinese tang yuan (glutinous rice balls). For a truly indulgent breakfast, try spreading some black sesame paste on toast in lieu of peanut butter, then drizzle a generous dose of honey and coconut milk over it. The nutty, slightly bitter paste is often paired with sweet flavors like matcha or red bean in Japan, and jaggery in India.

But in the realm of black-sesame-laden desserts, hakzimaawu (黑芝麻糊) reigns supreme. This traditional Cantonese dessert soup is made of black sesame seeds, rice, sugar, and water blended together and simmered into a hot, viscous, inky gloop. While the concept of soup for dessert might sound odd, its ubiquity in Cantonese meals is so great that it even has its own category—tong sui, literally meaning sugar water, as it brings a sweet, lingering end to the meal while serving as a tonic to invigorate or soothe the body, according to the tenets of Chinese medicine.

As far as tong suis go, hakzimaawu is one of the more uncommon ones, compared to tofu pudding or red bean soup. At first glance, hakzimaawu might resemble a potent witch’s brew or a squid ink concoction about to be mixed into pasta. Its mud-like viscosity doesn’t allow it to compete with the more photogenic black sesame desserts, like swirly soft serves and shiny tarts. But take a deep slurp and you’ll unlock a whole new world of pure, unbridled sesame nuttiness that you never knew existed.

The first place I ever had hakzimaawu, which also happens to be the only place I know of that still serves it, is at one of the vestiges of old-school Cantonese cooking in Malaysia—Ming Court in Ipoh. They’ve served traditional dim sum for decades, with timeless recipes from generations of Cantonese diaspora. Of all their authentic dim sums, their hakzimaawu is one that has a special place in my heart, bringing up childhood memories of satisfying, lip-staining slurps and black-toothed grins each time I have it. But since it’d be near madness to make a two-hour drive to Ipoh every time I have a hakzimaawu craving, I’ve resorted to making my own version at home.

So sure, the next time you chance upon some black sesame, you could sprinkle it over a dessert or treat it like a jam. But to truly harness the dark magic of black sesame and bring it to its fullest, purest potential, stir up a pot of hakzimaawu.

Ingredients

  • 3 tablespoons long-grain rice
  • 1 cup black sesame seeds
  • ¼ cup peanuts, shelled
  • ½ cup Chinese rock sugar (can substitute granulated sugar)
  • 1 teaspoon salt
  • 5 cups water

Don’t let its gloopy, jet-black appearance turn you off; black sesame soup (黑芝麻糊) is a gloriously nutty and aromatic Cantonese dessert. I first had it at an old-school dim sum shop in my mom’s hometown of Ipoh, Malaysia, and it was love at first slurp. Here I re-created this classic tong sui, adding a bit of peanuts into the mix to make a super fragrant, rich dessert.

  1. Soak the rice for at least 3 hours, or up to 12 hours. The rice should easily break apart post-soak.
  2. Preheat your oven to 320°F. Then spread the black sesame seeds and peanuts on two separate trays, toasting them in the oven until lightly browned. Alternatively, they can be toasted in a pan over low heat. Make sure to keep tossing and stirring to prevent them from burning.
  3. In a blender or food processor, blitz the sesame seeds and peanuts together until powdered. Be careful not to blend it for too long as they tend to release a lot of oil and clump up. A couple three-second bursts should do the trick! Add the soaked rice and roughly half of the water to the blender. Blend for 30 to 45 seconds until smooth.
  4. Place a sieve or strainer over a pot, and pour the blended liquid through the sieve. You’ll be left with some solid, pasty bits of black sesame in the strainer. Scoop this up and place it back into the blender. Add about a cup of water to the paste, and blend for another 30 seconds, then strain it into the pot again. If there is still a good amount of solids left in the strainer, repeat the blending-and-straining procedure once or twice more until there are barely any bits left in the strainer. Add any remaining water to the pot.
  5. Add the rock sugar and salt to the black sesame soup. Bring this to a boil, then turn down to a simmer. Let it cook, covered, for 10 to 15 minutes until it thickens and darkens in color.
  6. Serve piping hot!

Yi Jun Loh

Yi Jun Loh is a freelance writer and cook. An engineer by training, he immersed himself into the food industry right after graduating from Cambridge, learning to cook in Paris and then at Blue Hill at Stone Barns in New York. He is now based in Malaysia, obsessing over food culture and science through his blog Jun & Tonic.

[email_signup id="3"]
<div class="email-subscribe exp-subscribe subscribe"> <div class="alert alert-success exp-success ga-etembed-success" style="display:none;"> Great! You've signed up successfully! </div> <div class="alert alert-danger exp-error" style="display:none;"> We are experiencing an error, please try again. </div> <form name="subscribe" id="email-signup" class="email-signup-form" action="https://tastecooking.com/wp-admin/admin-ajax.php" method="POST" target="_top" data-event-assigned="false"> <fieldset class="form-group form-inline email-submit-group"> <label for="email-address" class="sr-only">Email Address</label> <input id="email-newsletter" type="email" placeholder="your@email.com" class="email-newsletter text email form-control" name="email" value=""> <button type="submit" value="Subscribe" name="subscribe" class="btn btn-primary email-submit-btn ga-etembed-success"> <i class="fa fa-envelope"></i> Subscribe </button> </fieldset> <small class="exp-small terms" style=""> By clicking Subscribe, I acknowledge that I have read and agree to the Penguin Random House <a href="http://www.penguinrandomhouse.com/privacy/" target="_blank">Privacy Policy</a> and <a href="http://www.penguinrandomhouse.com/terms/" target="_blank">Terms of Use</a> and agree to receive news and updates from TASTE and Penguin Random House. </small> <fieldset class="field-group checkboxes" style="display:none"> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50501,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook General</strong></span> </label> </div> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50502,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook Promo</strong></span> </label> </div> </fieldset><!-- /.checkboxes --> <input type="hidden" name="data_acq_code" value="TASTE_POPUP_STATIC_ONGOING" /> <input type="hidden" name="data_programs" value="50501|505,50502|505" /> <input type="hidden" name="form_id" value="3" /> <input type="hidden" name="partner" value="" /> <input type="hidden" name="action" value="crown_email_signup_submit" /> <input type="hidden" name="ref_url" value="" /> </form> </div> <script> jQuery(document).ready(function () { var unassigned_forms; setInterval( function() { //Check for unassigned forms var forms = jQuery( '.email-signup-form' ); unassigned_forms = false; forms.each( function( index ) { if ( jQuery( this ).attr( 'data-event-assigned' ) === 'false' ) { unassigned_forms = true; } }); if ( unassigned_forms ) { forms.off( 'submit' ).on( 'submit', function ( e ) { forms.attr( 'data-event-assigned', 'true' ); e.preventDefault(); // Basic email validation var email = jQuery(e.target).find('.email-newsletter').val(), valid_email = false, groupEl = jQuery(e.target).closest('.email-subscribe'); if ( !!email && typeof(email) === "string" ) { var email_array = email.split('@'); if ( email_array.length === 2 ) { if ( email_array[1].split('.').length > 1 ) { valid_email = true; } } } if ( valid_email ) { jQuery('.alert-danger').hide(); // Show loading gif groupEl.find('.email-signup-form').hide(); groupEl.find('.email-submit-loading').show(); // Populate ref_url jQuery(this).find('input[name="ref_url"]').val(window.location.href); // Generate Payload var payload = jQuery(this).serializeArray(); jQuery.ajax({ url: jQuery(this).attr('action'), type: 'POST', data: payload, success: function (data) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display success msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-success').show(); jQuery(e.target).parent().find('#downloadbtn').show(); }, fail: function (err) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display failure msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-danger').show(); } }); } else { groupEl.find('.alert-danger').html('Please enter a valid email address.').show(); } }); forms.off( 'keypress' ).on( 'keypress', function ( e ) { if ( e.which === 13 ) { e.preventDefault(); jQuery( this ).submit(); } }); } }, 100); }); </script>
[email_signup id="3"]
<div class="email-subscribe exp-subscribe subscribe"> <div class="alert alert-success exp-success ga-etembed-success" style="display:none;"> Great! You've signed up successfully! </div> <div class="alert alert-danger exp-error" style="display:none;"> We are experiencing an error, please try again. </div> <form name="subscribe" id="email-signup" class="email-signup-form" action="https://tastecooking.com/wp-admin/admin-ajax.php" method="POST" target="_top" data-event-assigned="false"> <fieldset class="form-group form-inline email-submit-group"> <label for="email-address" class="sr-only">Email Address</label> <input id="email-newsletter" type="email" placeholder="your@email.com" class="email-newsletter text email form-control" name="email" value=""> <button type="submit" value="Subscribe" name="subscribe" class="btn btn-primary email-submit-btn ga-etembed-success"> <i class="fa fa-envelope"></i> Subscribe </button> </fieldset> <small class="exp-small terms" style=""> By clicking Subscribe, I acknowledge that I have read and agree to the Penguin Random House <a href="http://www.penguinrandomhouse.com/privacy/" target="_blank">Privacy Policy</a> and <a href="http://www.penguinrandomhouse.com/terms/" target="_blank">Terms of Use</a> and agree to receive news and updates from TASTE and Penguin Random House. </small> <fieldset class="field-group checkboxes" style="display:none"> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50501,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook General</strong></span> </label> </div> <div class="checkbox"> <label> <input type="checkbox" name="programs[]" value="505,50502,1" class="exp-checkbox" checked="checked"> <span><strong>Tastebook Promo</strong></span> </label> </div> </fieldset><!-- /.checkboxes --> <input type="hidden" name="data_acq_code" value="TASTE_POPUP_STATIC_ONGOING" /> <input type="hidden" name="data_programs" value="50501|505,50502|505" /> <input type="hidden" name="form_id" value="3" /> <input type="hidden" name="partner" value="" /> <input type="hidden" name="action" value="crown_email_signup_submit" /> <input type="hidden" name="ref_url" value="" /> </form> </div> <script> jQuery(document).ready(function () { var unassigned_forms; setInterval( function() { //Check for unassigned forms var forms = jQuery( '.email-signup-form' ); unassigned_forms = false; forms.each( function( index ) { if ( jQuery( this ).attr( 'data-event-assigned' ) === 'false' ) { unassigned_forms = true; } }); if ( unassigned_forms ) { forms.off( 'submit' ).on( 'submit', function ( e ) { forms.attr( 'data-event-assigned', 'true' ); e.preventDefault(); // Basic email validation var email = jQuery(e.target).find('.email-newsletter').val(), valid_email = false, groupEl = jQuery(e.target).closest('.email-subscribe'); if ( !!email && typeof(email) === "string" ) { var email_array = email.split('@'); if ( email_array.length === 2 ) { if ( email_array[1].split('.').length > 1 ) { valid_email = true; } } } if ( valid_email ) { jQuery('.alert-danger').hide(); // Show loading gif groupEl.find('.email-signup-form').hide(); groupEl.find('.email-submit-loading').show(); // Populate ref_url jQuery(this).find('input[name="ref_url"]').val(window.location.href); // Generate Payload var payload = jQuery(this).serializeArray(); jQuery.ajax({ url: jQuery(this).attr('action'), type: 'POST', data: payload, success: function (data) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display success msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-success').show(); jQuery(e.target).parent().find('#downloadbtn').show(); }, fail: function (err) { // Hide loading spinner groupEl.find('.email-signup-form').show(); groupEl.find('.email-submit-loading').hide(); // Display failure msg var target = jQuery(e.target); jQuery(e.target).hide(); jQuery(e.target).parent().find('.alert-danger').show(); } }); } else { groupEl.find('.alert-danger').html('Please enter a valid email address.').show(); } }); forms.off( 'keypress' ).on( 'keypress', function ( e ) { if ( e.which === 13 ) { e.preventDefault(); jQuery( this ).submit(); } }); } }, 100); }); </script>